斯坦福编译原理笔记-7 递归下降解析

217 阅读2分钟

理论

解析树构建流程

自上而下 自左到右

递归下降局限性

image.png

image.png
一旦找到成功的表达式,就不会往下走了,也不会回溯了。

左递归

递归下降不适合左递归语法 对于以下形式的左递归语法:

image.png
可以通过如下变换消除左递归

image.png

预测解析

特点: 1.向前读取几个token 2.没有回溯 消除公共前缀

image.png

image.png

实践

压栈式有限状态自动机PDA
为什么不直接用DFA?
DFA不能对输入的字符进行统计或技术,因此需要配备一个堆栈,从而避免字符计数难题。

image.png

image.png

构建跳转表,二维表中的查找结果对应于某种动作。

大多数编程语言,编译运行时都有一个函数调用堆栈,也就是当一个函数调用另一个自己函数时,代码会首先将当前的饿变量和状态信息以及跳转地址压入堆栈,然后跳转到被调用的函数,执行完重新返回调用该函数的地阿芳,这种代码跳转也是基于当前的PDA算法。

利用PDA做语法分析步骤

1.解析堆栈是空的,语法解析结束。
2.栈顶端是非终结符,将它对应的右边推导以逆向方式压入堆栈,例如推导a -> bcd ,则我们先将d压入,然后是c,然后是b.如果右边是epislon,直接将栈顶元素弹出。
3.如果栈顶是终结符,那么该终结符必须与当前读入的字符匹配,不然为语法错误。如果匹配,将它弹出栈顶,转到步骤1.

自动化解析算法步骤

while (堆栈不为空) {
    if (栈顶元素表示action) {
        执行action
    }
    else if (栈顶是终结符) {
        if (当前读入与终结符不匹配) 语法错误
        else 将终结符弹出堆栈
    }
    else {
        todo = 根据栈顶和当前输入查解析表
        if (todo == -1) 语法错误
        else {
            解析符号弹出堆栈,对应推导反向入栈
        }
    }
}

如果构造了属性化堆栈,在压解析堆栈时也要压属性堆栈

自动化解析表构建流程

1.构建first set

初始化将所有非终结符的first set都设置为空

image.png
当所有非终结符的first set不再有变化时,算法结束

2.构建follow set

image.png
当所有非终结符的follow set不再有变化时,算法结束

3.构造selection set

这个集合其实就是根据当前解析栈栈顶元素和当前输入来确定要替换的推导式。

image.png

4.构建解析表

根据选择集构建解析表

image.png