LR(K)
Step
- Shift: 将输入串最前面的字符入栈。
- Reduce: 查看栈顶的字符是否符合文法,符合将其换为对应的非终结符。(往左换)
增广: S ′ → S S' \rightarrow S S′→S
Reduce的时机
when the handle occur
Handle: 分析树中最左边具有父子两代的子树的树叶节点。
describe
- L: from left to right
- R: rightmost derivation
- K: look ahead
LR(0) Item
产生式最右边添加一个唯一的位置信息。
原文法:
A
→
β
s
A\rightarrow \beta s
A→βs
项目(item):
A
→
β
⋅
s
A\rightarrow \beta · s
A→β⋅s
点左边的是已经观察到的,点右边的是期望符号。
- initial item 初始项目
- complete item 完整项目,找到就找到handle了。
可以使用NFA->DFA解决。
构造DFA
- 将文法表达式构造增广文法 S ′ → S S' \rightarrow S S′→S
- 构造初始项目,如果遇到非终结符展开非终结符。
- 枚举全部情况往下看一个,直到找到一个完整项目,分支结束。
语法分析表
State | Action | Goto |
---|---|---|
no. | s_i, R_j | no. |
s_i :进入到i状态
r_j : 使用标号为j的文法规约
Goto: 非终结符号的转换,其中填状态的编号