【编译原理】手工打造语法分析器
创作时间:
作者:
@小白创作中心
【编译原理】手工打造语法分析器
引用
CSDN
1.
https://blog.csdn.net/shuofxz/article/details/137476161
本文将详细介绍编译原理中语法分析器的构建方法,重点讲解递归下降算法和上下文无关文法,并通过具体的代码示例和AST树的生成过程,详细阐述如何处理左递归问题。
一、递归下降算法
还是这个例子:
int age = 45
我们给出这个语法的规则:
intDeclaration : Int Identifier ('=' additiveExpression)?;
如果翻译为程序的话,伪代码如下:
MatchIntDeclare(){
MatchToken(Int); // 匹配 Int 关键字
MatchIdentifier(); // 匹配标识符
MatchToken(equal); // 匹配等号
MatchExpression(); // 匹配表达式
}
输出的 AST 类似于:
Programm Calculator
IntDeclaration age
AssignmentExp =
IntLiteral 45
上面的过程,称为「递归下降算法」。从顶部开始不断向下生成节点,其中还会有递归调用的部分。
二、上下文无关文法
上面的例子比较简单,还可以用正则表达式文法来表示。但如果是个算数表达式呢?正则文法就很难表示了。
- 2+3*5
- 2*3+5
- 2*3
这时我们可以用递归的规则来表示:
additiveExpression
: multiplicativeExpression
| additiveExpression Plus multiplicativeExpression
;
multiplicativeExpression
: IntLiteral
| multiplicativeExpression Star IntLiteral
;
生成的 AST 为:
如果要计算表达式的值,只需要对根节点求值就可以了。这个就叫做「上下文无关文法」。
但你把上述规则翻译为代码逻辑时,会发现一个问题,无限递归。
我们先用个最简单的示例:
additiveExpression
: IntLiteral
| additiveExpression Plus IntLiteral
;
比如输入:
2+3
- 先判断其是不是
IntLiteral,发现不是 - 然后匹配
additiveExpression Plus IntLiteral,此时还没有消耗任何的 token - 先进入的是
additiveExpression,此时要处理的表达式还是2+3 - 又回到开始,无限循环
这里要注意的一个问题:
并不是觉得 2+3 符合 additiveExpression Plus IntLiteral 就能直接按照 + 拆分为两部分,然后两部分分别去匹配。这里是顺序匹配的,直到匹配到该语法规则的结束符为止。在 additiveExpression Plus IntLiteral 中 additiveExpression 的部分,也是在处理完整的 token 的(2+3)。
三、左递归解决方案
改为右递归
如何处理这个左递归问题呢?我们可以把表达式换个位置:
additiveExpression
: IntLiteral
| IntLiteral Plus additiveExpression
;
先匹配 IntLiteral 这样就能消耗掉一个 token,就不会无限循环了。
比如还是 2+3
2+3不是IntLiteral,跳到下面2+3的第一个字符是2被IntLiteral消耗掉,并结束IntLiteral匹配- 然后
+被Plus消耗掉 - 最后
3进入additiveExpression,匹配为第一条规则IntLiteral
这样就结束了,没有无限循环。
改写成算法是:
热门推荐
“莫愁千里路自有到来风”:解读这句诗的深层智慧
买山药,选粗的还是选细的?内行人教你6招,买到的都是好山药
铁路出行身份证忘带或遗失莫慌 两种方法让您顺利乘车
在哪里办理宠物证明:法律依据与操作指南
深圳春日赏花必逛!公交直达!
深圳十大赏花地:一个小时可达,浪漫值超标
2024四川旅游全攻略:简阳深度游路线与周边精华景点指南
中国律师制度发展历程:从近代到当代
沪深300股指期权一手价格详解:合约价值与保证金计算
探秘祖冲之与刘徽:古代数学家的天文传奇与历史影响
如何正确操作离合器?离合器操作的技巧和注意事项是什么?
如何正确更换汽车机油滤芯?更换汽车机油滤芯的频率是怎样的?
鼻屎突然增多怎么回事?原因及应对方法全解析
触摸屏的触摸力度反馈
日语学习之如何在大学里提高日语会话能力?快速掌握技巧成为日语达人
去除螨虫最好方法有哪些
云南省首例PET/CT引导下的肺结节穿刺术在昆明医科大学第二附属医院成功开展
第一学历和最高学历的区别是什么
六百多年前,郑和下西洋竟凭借了这些气象智慧?
考研调剂全流程解析与关键节点把控
瞭望1号:500公里外的超级CT扫描,全球最强海上预警船要来了!
三段婚姻五个子女,"不靠谱"的特朗普养的娃没有一个走歪
辅酶Q10:守护心脏,抗氧化的天然卫士
陪审制度是什么?从起源到现状的全面解读
国医大师:何任
如何科学种植和管理柿子树(柿子树的种植时间、生长周期及关键管理技巧)
什么是企业职位分析?
自制海苔碎
口腔综合治疗台水路的污染与控制
什么是脚本,脚本有什么用,如何调用脚本?