实现一个SLR(1)语法分析器,近期忙于他事,项目集和语法分析表暂时采用手动输入,有空再填坑,后附源码。
SLR是基于LR(0)实现的,故先进行LR(0)分析。
Tips:
龙书给的4.36算法伪代码写得过于简略,容易造成误导,本文给出具体算法和分析过程。
代码在https://github.com/monimm/LLandLR
SLR(1)分析流程
- 输入文法
- 求first集
- 求follow集
- 构造LR(0)项目集
- 构造DFA
先上结果截图
自底向上分析
- 自底向上分析法,又称为移进-归约法。
目前流行的自底向上的语法分析器都基于LR(k)语法分析: L表示从左至右,R表示向左推导,k表示决定时向前看的符号个数 - LR分析是表格驱动的
对输入符号串自左向右进行扫描,并将输入符逐个移入一个先进后出栈中,边移进边分析,一旦栈顶符号串形成某个句型的可归约串时,就用相应产生式的左部非终结符代替此可归约串。重复这一过程,直到归约到栈中只剩下文法的开始符号时分析成功。
冲突
移进-归约冲突
即使知道了栈的所有内容以及接下来的k个输入符号,仍然无法判断应该进行移进还是归约操作
归约-归约冲突
无法在可能的多个归约方法中选择正确的归约动作。
LR(0)分析
增广文法
如果G是一个以S开始符号的文法,那么G的增广文法G’就是在G中加上新开始符号S’和产生式S’ → S而得到的文法。
目的是告诉分析器何时停止语法分析
LR(0)自动机