LR(k)语法分析概念
LR中的:
- L表示对输入串进行从左到右扫描
- R表示最右推导的逆过程
- k表示最多向前看k个符号
当k的数量增大时,语法分析器的规模将急剧增大;
- k = 0时,向前看符号只有当前输入符
- k = 1时,向前看符号有当前输入符和FOLLOW(A)
FOLLOW(A):向前看符号。针对文法,而不是针对输入串。
LR语法分析技术:SLR技术
规约:栈顶的句柄从栈中弹出,然后将对应产生式的头部压入栈中
因此入栈的符号既有终结符id,*,+,(,)
也有非终结符 E,T,F
对每个产生式,跟踪栈中句柄的满足程度。
开始时,栈为空
增广文法
对文法的开始符号E,加一个产生式:E’ → E。 只有发生这个规约,才说进入接受状态。原因 在于出现E并不代表树生成完毕。
为什么E→E+T这个规约并不代表进入接受状态, 因为id+id+id, 就会有两次E→E+T规约,然后 才进入接受状态。
移入-规约决策问题研究的切入点——LR(0)项目
在LR分析中,每一次归约都以一条产生式为依据
就产生式A→XYZ进行规约 ,从时间概念上看,要X,Y,Z依 次进栈,最终紧挨,在栈顶。
为了区分不同的时间点,可在文法G的每个产生式的右部添加 一个圆点,称为文法G的LR(0)项目。
圆点前面代表“历史”(已识别的串),圆点后面代表“期待”
对产生式:A→XYZ,共有四个LR(0)项目:
A
→
⋅
X
Y
Z
,
A
→
X
⋅
Y
Z
,
A
→
X
Y
⋅
Z
,
A
→
X
Y
Z
⋅
A→·XYZ, A→X·YZ, A→XY·Z, A→XYZ·
A→⋅XYZ,A→X⋅YZ,A→XY⋅Z,A→XYZ⋅
LR(0)项目的闭包——项集
项集 I 0 I_0 I0:当前E’ → E归约要发生时,语法分析完成
闭包:直接关系、间接关系、所有可能的情形
E ′ → ⋅ E E'→·E E′→⋅E:期待E的出现。加进来的这些LR(0)项目,都会助推E的出现。
期待E的出现。E的出现,又取决于T的出现。T的出现,又取决于F 的出现。F的出现,又要首先出现(或者id。
再倒过来,id出现,就可规约出F。F的出现,就可规约出T。T的 出现,就可规约出E。E的出现,就可能规约出E’.
项集I的GOTO函数: GOTO(I,X)
对一个项集合I,当一个符号X(终结符,或非终结符)进栈 时,该项集发生的变迁