官术网_书友最值得收藏!

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)造編程語言這件事情,不管怎么說都是很酷的吧。

主站蜘蛛池模板: 淮阳县| 陕西省| 灵宝市| 马龙县| 旅游| 新兴县| 房山区| 修文县| 满洲里市| 郯城县| 永胜县| 南宫市| 和龙市| 凭祥市| 潞西市| 顺义区| 客服| 张家口市| 石狮市| 常州市| 鄄城县| 湖北省| 黄冈市| 南乐县| 桂林市| 含山县| 鄂尔多斯市| 大石桥市| 桦甸市| 昌宁县| 宣化县| 玉溪市| 高邮市| 建水县| 丁青县| 基隆市| 宁阳县| 新绛县| 冕宁县| 玉田县| 忻城县|