1.2 自制編程語言并不是很難
一提起自制編程語言,很多人都會(huì)覺得這是一件非常難的事情。
比如,即便是一個(gè)很常見的賦值語句:
a1 = b1 + b2 * 0.5;
在自制編程語言時(shí)都必須考慮到以下幾個(gè)要點(diǎn)。
1.需要將a1、 b1、 b2作為變量名解析出來。如果按照C語言的語法規(guī)則,變量名只能由字母或下劃線開頭,從變量名第二個(gè)字符開始才允許出現(xiàn)字母或數(shù)字。所以首先必須掃描這個(gè)語句,然后將匹配上述語法規(guī)則的部分提取出來。
2. 0.5是一個(gè)含有小數(shù)點(diǎn)的常量,在提取這類常量時(shí),能否用“數(shù)字組合+小數(shù)點(diǎn)+數(shù)字組合”來概括所有常量的特征呢(還要考慮是否允許00.10這樣的數(shù)值)。當(dāng)然我們的提取規(guī)則還要能處理2這樣不含小數(shù)點(diǎn)的數(shù)值。
3.乘法運(yùn)算符 *比 +擁有更高的運(yùn)算優(yōu)先級(jí),語句必須被解析為b1 +(b2 * 0.5)。4. b2 * 0.5的計(jì)算結(jié)果,必須在與b1進(jìn)行加法運(yùn)算前就應(yīng)該取得。也就是說對(duì)于復(fù)雜的計(jì)算,需要保存很多類似這樣的臨時(shí)運(yùn)算結(jié)果。
假如你已經(jīng)有了一定的編程經(jīng)驗(yàn),肯定能想到上面這些難點(diǎn),甚至可以說你的編程經(jīng)驗(yàn)越豐富,就越能感受到這其中隱藏著極大的難題。
不過,編程語言的語法處理器在FORTRAN誕生后已經(jīng)經(jīng)過了多年的研究,上面的這些難點(diǎn)都已經(jīng)可以從前人那里找到解決方法注3。
注3當(dāng)然,在早年原始的研發(fā)條件下,人們?yōu)榱碎_發(fā)第一個(gè)編程語言編譯器還是花費(fèi)了相當(dāng)大的精力,據(jù)說實(shí)現(xiàn)初版的FORTRAN編譯器所花費(fèi)的工時(shí),累計(jì)達(dá)到了216人月[1]。
在本書中,上面1~3的問題會(huì)用到名為yacc及l(fā)ex的工具。問題1和問題2用lex,問題3通過yacc解決。yacc和lex都是非常老的工具了,現(xiàn)在流行的LL語言大多內(nèi)置了yacc。可能有人會(huì)說:“既然是以學(xué)習(xí)為目的去制作一門編程語言,如果還使用工具的話就太投機(jī)取巧了吧。”(這話很有道理。)所以在本書中,也會(huì)稍微介紹一下不使用這些工具的解決方法。
無論是使用工具,還是基于一些已有的解決方案自己編寫,如果能掌握一些竅門的話,自制編程語言其實(shí)并不難。
那么你想不想試試自己制作一門編程語言呢?自己創(chuàng)造編程語言這件事情,不管怎么說都是很酷的吧。
- HTML5移動(dòng)Web開發(fā)技術(shù)
- Python快樂編程:人工智能深度學(xué)習(xí)基礎(chǔ)
- PowerCLI Cookbook
- 你必須知道的204個(gè)Visual C++開發(fā)問題
- Windows Presentation Foundation Development Cookbook
- 3D少兒游戲編程(原書第2版)
- C語言程序設(shè)計(jì)學(xué)習(xí)指導(dǎo)與習(xí)題解答
- Java EE 8 Application Development
- C# 8.0核心技術(shù)指南(原書第8版)
- C語言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo) (第2版)
- Fast Data Processing with Spark(Second Edition)
- 零基礎(chǔ)學(xué)C語言程序設(shè)計(jì)
- QGIS 2 Cookbook
- Mastering JavaScript
- Java程序設(shè)計(jì)教程