收集、保存程序设计语言演化过程中的一些重要代码
现在的程序设计语言实现大多已经相当的复杂,如果直接用源码来研究、学习编译原理难度是非常大的。如果有更早期一点的语言实现来参考就好理解得多。 这样的代码或者相关文档已经比较难找,所以这里尽量收集上来。这其中有些来自其他项目的,还有一些是我工作中无意收集到的,可能比较多的会是我修改过的。还有一些是我实际工作中还在使用的用来完成一些简单语言工作的。 还有一些是担心别的项目中修改掉而放在这里备份的,例如 antlr 4 的 pascal 和 c 语言的文法文件目前保持着比较原始的状态,很适合用来研究程序语言的发展,这很显然随时都有可能更新在更现代化的实现,那样的话就会比较难理解或者是实现了。 比如同期的 lua 文法文件简单好理解得多,但它实际上是用了非常新的实现方式的,如果您用的不是 antlr 而是另外一个生成器,那么几乎不可能按照它的文法来写传统实现代码,因为 antlr 已经进化了二十多年,很多特性不是手写代码那么容易模拟的,也很不适合用来编译原理入门。 同理,现在像 antlr 这样的生成器是非常多的,这还不算比较原始的 yacc 这一大类,但是它们都太复杂,不适合用来学习。 还有一些像 monkey、Teal 这样的语言是用非传统的方式来实现的,乍一看似乎更简单更容易实现,但实际上有些步骤的原理相当复杂,而传统实现实际上基本上可能直接按文法来一个个实现相关函数就可以了,代码看起来多,实际上更容易理解和控制得多。
而且龙书这种用文法来讲解的书籍,它们的文法包括大多数现在市面上的文法种类都是用传统实现的角度来书写的。其实我觉得龙书作为入门书来用的话是最失败的,这也是为什么很多人自学编译原理都以失败而告终的原因,因为龙书太有名了,所以大家迫不及待的用它来入门。 但是它缺失了基础的部分,一上来就是文法,实际上文法本身就是实现方法的总结,它跳过了实现方法只是很认真的讲解了最终的结果,能听懂那才是怪事了。
所以我们这个项目收集的内容也偏向于基础的实现方法,不过确实,我打算上传的第一个文件就是 pascal 和 c 语言的传统文法文件 :)
这个也作为 cccscript 项目的子项目存在。
另外,理论永远只是理论,很多的细节是要在实际的开发过程中才能体会的,而且有时要在多个项目中反复对照你才会明白大家为什么都这样做。单个项目中呈现出来的代码通常是根据自己的需求裁剪过了的,而且每个人的理解并不相同,理解的程度也不同。 所以最好的学习方法是多动手,对于编译原理来说尤其是这样。