摘要:针对自定义的脚本语言,设计LR(1) parser。LR(1) parser利用之前的parser generator生成的action table和grammar表格,生成抽象语法树(AST)作为中间语言(IR)。
代码地址:https://github.com/nklofy/Compiler
也可以在我的上传资源中下载
先说LR的自动生成的parser和LL的手写的parser。业界上常用的语言的编译器,往往手写的LL的较多。这是因为LR的编译器,状态数特别多,复杂度过高,人脑往往不能直观的思考,这样就依赖于parser generator自动生成。而parser generator自动生成,必须保证语法产生式设计合理,无冲突,无bug,如果是作为练手的玩具还好,如果业界实用的编程语言,往往corner case太多,难以用一张语法表清晰地归纳出来。调试也较困难,因为往往问题出在语法产生式的设计上。手写的LL编译器,代码结构即反映了语法规则,corner case可以随意发挥,调试起来也容易定位。但是缺点是正确性难以保证,而LR parser只需保证语法产生式的正确性。
前面已经写好了lex analyzer和parser generator,接下来的任务就是定义语法式。这个版本的脚本语言,支持的语言特性有:
1,基本类型。int(内部实现为long,只支持64位);double;bool;string;char。以后会再增加class类型、数组类型。对应TypeExp,产生语法树的类型是AST_TypeExp。
2,变量定义与赋值。与C的