【编译原理】手工打造语法分析器
创作时间:
作者:
@小白创作中心
【编译原理】手工打造语法分析器
引用
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
这样就结束了,没有无限循环。
改写成算法是:
热门推荐
IPO闯关失败,芯片独角兽纷纷“卖身”上市公司
探秘南北朝|青瓷里的南北对峙和民族融合
中国的五行,太厉害了!
崩坏星穹铁道2.1版3倍位面掉落攻略:详细刷取分析及适配角色推荐
如何低成本制作一锅好高汤
千岛湖火车站打车到千岛湖中心湖区多少钱?坐公交要多久?
温州十大土特产伴手礼,亮相!
每个人都有自己的秘密和孤独——读村上春树的《天黑以后》
如何分析股票市场的交易量变化?这种变化对投资者的决策有何指导意义?
“糖油混合物”该怎么吃和补救?
25届国家电网校招校招难度及职业发展全解析!网调还是省会供电局?
计算机毕设论文撰写全攻略:从入门到精通
债务管理方案:实现财务健康的关键策略
乾隆为何选择平庸的嘉庆做继承人呢?其中有什么道理?
南京玄武湖现罕见景象:桃花樱花秋季齐绽放
家用车换机油周期与选择指南:科学方法助您省钱省心
换了人工髋关节,能否重拾运动自由?
章邯:秦末名将的传奇人生
达达回归京东?创始人蒯佳祺离职,辛利军接棒会否挺进外卖
红酒涩口怎么办,为什么干红葡萄酒涩口?
板绘绘画抓型练习怎么练易上手?
肿瘤标志物CEA变化:如何科学应对?
广州1000万预算购买大平层的逻辑!
2024视觉传达设计世界大学排名
西梅饮的益处与饮用须知
辽宁东戴河新区产业链招商共建共享高质量发展新路径
蔚山现代谈泰山:重点关注谢文能而非克雷桑、泽卡
官宣!北京这10天不限行!
天地始冻 万物收藏——探寻立冬节气里的陕西文化符号
004核动力航母将问世,10万吨排水量开启全球海权新纪元