【编译原理】手工打造语法分析器
创作时间:
作者:
@小白创作中心
【编译原理】手工打造语法分析器
引用
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
这样就结束了,没有无限循环。
改写成算法是:
热门推荐
什么是债务重组的定义及特征
RES文件格式(通用资源文件)
30岁后得分40+场次最多的NBA球员,詹姆斯不如库里
从尘埃到蓝色星球:地球的诞生与早期演化
电动车撞车后对方全责不赔偿,应采取哪些法律措施?
4.9的视力是多少度?视力与屈光不正的全面解析
中国古代诗词英译品读:会当凌绝顶 一览众山小
如何判断C语言合法整数
医生提醒:服用诺氟沙星期间切勿饮酒
房东违约中介费该退还吗怎么办
长征中绞断肠子师长叫陈树湘,抗战时击毙阿部规秀的团长叫陈正湘
外籍人士必看!没有SSN也能轻松开设美国银行指南
NEJM:新一代多靶点粪便DNA检测对结直肠癌的敏感性高达93.9%!
VI视觉设计手册的页数标准与内容构成
领匠酒文化课堂:酱香型白酒的口感特点可以概括为哪些
大学绩点低于多少不能毕业?怎么补救?大学绩点满分是4还是5
备用金多少才够?
以数字技术赋能无障碍环境建设
海湾国家森林公园梅花节正当时,4万株梅花绘就“粉雪烟霞”
惊艳的黄色:揭秘铬酸根离子的奥秘
2026世界杯大洋洲预选赛:足球热潮为何未席卷太平洋岛屿?
为何欧洲球队没有世界杯预选赛?原因有两个,名额最多,赛程轻松
山海经中的"嚣":一种神秘的异兽或鸟类
除了降压药,高血压患者做好9个生活方式调整,辅助预防控制血压
复旦大学团队发布重大研究成果:中国原创免疫药助力三阴性乳腺癌治疗获突破
应交增值税应该怎么记账?进项税和销项税如何记账?
月薪4000负债30万,如何应对不同负债情况?
热天喝甘蔗汁防止脱水
甘蔗汁的功效
郑钦文2025年3月赛程最新比赛消息:IW首战时间、对手确定