本文更新于2024-05-28 20:23:46
1. LR(0)分析#
1.1 可归前缀和活前缀#
定义1.1.1 如果文法G的拓广文法G′有正规推导S′⇒∗αAωR⇒αβω,且若γ是串αβ的一个前缀,则γ是文法G′和G的一个活前缀。γ是规范句型αβω的前缀,但是它不会超过αβω的句柄的右端。
如果γ=αβ则γ是文法G的一个可归前缀。
TIPLR(0)分析方法实际上就是在不断列出αβ的前缀,一旦出现αβ也就是出现了可归前缀,就立刻使用A→β归约句柄。
1.2 求解活前缀与可归前缀#
如果G是一个上下文无关文法,G′是其拓广文法,对每一个非终结符A,定义LC(A)运算。
LC(A)={α∣S′⇒∗αAω,A∈VN,ω∈VT∗}TIPLC(A)运算的结果是所有包含有A的正规句型中A左边的符号串。
通过LC(A)就能找出所有不包含句柄的活前缀。
定理1.1.1 若有产生式B→αAω,则LC(A)⊇LC(B)×{α}
通过该定理,依次列方程求LC(A):
LC(S′)={ε}LC(S)=⋯LC(A)只求出了非终结符A在未被替换时左部可能产生的串,还未能形成句柄。定义产生式A→β的LR(0)CONTEXT(A→β)运算:
LR(0)CONTEXT(A→β)=LC(A)×{β}得到的串就都是可归前缀。
以每一个产生式A→β的LR(0)CONTEXT(A→β)构造一个NFA,终态为可归前缀。接着从开始状态X连空弧向每一个NFA,得到一个大NFA,该NFA