1.2 自制编程语言并不是很难
一提起自制编程语言,很多人都会觉得这是一件非常难的事情。
比如,即便是一个很常见的赋值语句:
a1 = b1 + b2 * 0.5;
在自制编程语言时都必须考虑到以下几个要点。
1.需要将a1、 b1、 b2作为变量名解析出来。如果按照C语言的语法规则,变量名只能由字母或下划线开头,从变量名第二个字符开始才允许出现字母或数字。所以首先必须扫描这个语句,然后将匹配上述语法规则的部分提取出来。
2. 0.5是一个含有小数点的常量,在提取这类常量时,能否用“数字组合+小数点+数字组合”来概括所有常量的特征呢(还要考虑是否允许00.10这样的数值)。当然我们的提取规则还要能处理2这样不含小数点的数值。
3.乘法运算符 *比 +拥有更高的运算优先级,语句必须被解析为b1 +(b2 * 0.5)。4. b2 * 0.5的计算结果,必须在与b1进行加法运算前就应该取得。也就是说对于复杂的计算,需要保存很多类似这样的临时运算结果。
假如你已经有了一定的编程经验,肯定能想到上面这些难点,甚至可以说你的编程经验越丰富,就越能感受到这其中隐藏着极大的难题。
不过,编程语言的语法处理器在FORTRAN诞生后已经经过了多年的研究,上面的这些难点都已经可以从前人那里找到解决方法注3。
注3当然,在早年原始的研发条件下,人们为了开发第一个编程语言编译器还是花费了相当大的精力,据说实现初版的FORTRAN编译器所花费的工时,累计达到了216人月[1]。
在本书中,上面1~3的问题会用到名为yacc及lex的工具。问题1和问题2用lex,问题3通过yacc解决。yacc和lex都是非常老的工具了,现在流行的LL语言大多内置了yacc。可能有人会说:“既然是以学习为目的去制作一门编程语言,如果还使用工具的话就太投机取巧了吧。”(这话很有道理。)所以在本书中,也会稍微介绍一下不使用这些工具的解决方法。
无论是使用工具,还是基于一些已有的解决方案自己编写,如果能掌握一些窍门的话,自制编程语言其实并不难。
那么你想不想试试自己制作一门编程语言呢?自己创造编程语言这件事情,不管怎么说都是很酷的吧。