自制脚本语言(5) 自制的编译器——LR(1) parser

本文介绍了如何为自定义脚本语言设计LR(1)解析器,利用解析器生成器创建action table和grammar,构建抽象语法树作为中间语言。文章提到了LR与LL解析器的区别,以及自制LR(1)解析器在处理语言特性如基本类型、变量定义、函数定义等方面的实现。最后,概述了语法产生式如何转换为状态转移表,并展示了编译器设计中的AST工厂模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:针对自定义的脚本语言,设计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的基本类型操作相似。对应VarDef和VarAssign。意为definition和assignment。产生语法树的类型是AST_VarDef和AST_VarAssign。

3,函数定义。与C相似,支持递归函数。但不支持函数声明。对应FuncDef。产生语法树的类型是AST_FuncDef。

4,函数调用。与C相似。归到ApplyExp中。产生语法树的类型是AST_Apply。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值