编译解析技术全解析
1. 解析概述
解析器是典型编译器的核心,它调用扫描器获取输入程序的词法单元,将这些词法单元组合成语法树,并将语法树传递给编译器的后续阶段进行语义分析、代码生成和优化。这种编译方式有时被称为语法导向翻译。
对于上下文无关文法(CFG),可以创建一个时间复杂度为 $O(n^3)$ 的解析器,其中 $n$ 是输入程序的长度。不过,并非所有文法都需要如此通用且慢速的解析算法,存在许多可以构建线性时间解析器的文法类,其中最重要的两类是 LL 和 LR。
LL 表示“从左到右,最左推导”,LR 表示“从左到右,最右推导”。在这两类解析中,输入都是从左到右读取的。LL 解析器寻找最左推导,LR 解析器寻找最右推导。
LL 解析器也被称为“自顶向下”或“预测性”解析器,它从根节点开始构建解析树,根据下一个可用的输入词法单元预测每个步骤将使用的产生式。LR 解析器也被称为“自底向上”解析器,它从叶子节点开始构建解析树,当识别到一组叶子节点或其他节点可以组合成一个父节点的子节点时,就进行合并。
2. LL 解析
2.1 递归下降解析
以一个简单的“计算器”语言的文法为例,该语言允许将值读入数值变量,在表达式中使用这些变量,并将表达式的结果输出。控制流是严格线性的,扫描器在输入结束时会产生结束标记($$)伪词法单元。
递归下降解析器的子例程与文法的非终结符一一对应。以下是该计算器语言递归下降解析器的伪代码:
procedure match(expected)
if input t
超级会员免费看
订阅专栏 解锁全文
905

被折叠的 条评论
为什么被折叠?



