小结:LR(0)项目集规范族的构造(构成识别一个文法活前缀的DFA的状态的全体) 根据定义对于任一G[S]: 若S’ ![]() ![]() ![]() ![]() R R 若γ ![]() 活前缀与句柄的关系: - ![]() - ![]() - 活前缀不含有句柄的任何符号,此时期望产生式A→β的右部所推出的符号串。 为刻划这种分析过程中的文法G的每一个产生式的右部符号已有多大一部分被识别(出现在栈顶),分别用标有圆点的产生式来指示位置,标有圆点的产生式称为项目。 A→·β A→β1·β2 A→β· 对于A→ε的LR(0)项目为A→·是归约项目,绝对不能写成 A→·ε 和 A→ε·否则在构造分析表时会引起严重错误。 根据圆点所在的位置和圆点后是终结符还是非终结符或为空把项目分为以下几种: 移进项目,形如 A →α·aβ a是终结符,α,β∈V* 以下同 待约项目,形如 A →α·Bβ 归约项目,形如 A →α· 接受项目,形如 S’→S · 直接由产生式构造识别活前缀的DFA算法为计算LR(0)项目集的闭包CLOSURE、GO 函数和项目集规范族。 ① 计算闭包CLOSURE函数 function CLOSURE (I); /* I 是项目集*/ { J:= I; repeat for J 中的每个项目A →α·Bβ和产生式 B→γ,若B→·γ不在J中 Do 将 B→·γ加到J中 until 再没有项目加到J中 return J }; ② 计算GO函数和LR(0)项目集规范族 C={I0 ,I1 , ... ,In } procedure itemsets(G’); begin C := { CLOSURE ({S’→·S})} repeat for C 中每一项目集I和每一文法符号x do if GO(I,x) 非空且不属于C then 把 GO(I,x) 放入C中 until C 不再增大 end; |