文章目录
文法规范句型的活前缀
- 字符串的前缀是指字符串的任意首部,例如字符串"abc"的前缀有 ϵ \epsilon ϵ、
a
、ab
、abc
。 - 规范语句活前缀是指规范语句的前缀,这种前缀不包括句柄右边的任何符号
在LR分析工作过程中的任何时刻,栈中的文法符号应是某一规范句型的活前缀。这是因为一旦句型句柄在栈的顶部形成,就会立即被规约,因此只要输入串已扫描过得部分保持可规约成一个活前缀,那就意味着所扫描过的部分是正确的。这样一来,我们对句柄的识别就变成对规范句型活前缀的识别。
LR(0)项目
活前缀与句柄之间的关系存在三种情况:
- 活前缀中已经含有句柄的全部符号,表明此时某一规则 A → α A\rightarrow{\alpha} A→α的右部符号串 α \alpha α已经出现在栈顶,其相应的分析动作使用此规则进行规约
- 活前缀中只含有句柄的一部分符号,此时意味着形如 A → α 1 α 2 A\rightarrow{\alpha_1\alpha_2} A→α1α2规则的右部子串 α 1 ! \alpha_1! α1!已出现在栈顶,正期待着从剩余的输入串中进行规约得到 α 2 \alpha_2 α2
- 活前缀中全然不含有句柄的任何符号,此时意味着期望从剩余输入串中能看到由某规则 A → α A\rightarrow{\alpha} A→α的右部 α \alpha α所推出的符号串
为了刻画在分析过程中,文法的一个规则右部符号串已有多大一部分被识别,我们可在文法中每个规则右部适当位置加一个圆点来表示。针对上述3中情况,标有圆点的规则分别为:
A → α ⋅ A \rightarrow{\alpha·} A→α⋅
A → α 1 ⋅ α 2 A \rightarrow{\alpha_1·\alpha_2} A→α1⋅α2
A → ⋅ α A \rightarrow{·\alpha} A→⋅α
文法G中右部标有圆点的规则称为G
的一个LR(0)项目
注:规则 A → ϵ A\rightarrow{\epsilon} A→ϵ仅有LR(0)项目 A → ⋅ A\rightarrow{·} A→⋅
不同的LR(0)项目反映了在分析过程中栈顶的不同情况,因此,可以根据圆点后是终结符还是非终结符,将一个文法的全部LR(0)项目进行分类:
- 规约项目:形如 A → α ⋅ A \rightarrow{\alpha·} A→