什么是手柄修剪?
句柄是与产生式的主体匹配的子字符串,该产生式的归约表示一个步骤以及最右派生的反向。
右序列形式 Y 的句柄是 Y 的产生式,其中可以找到字符串S 并将其替换为 A 以产生 Y 的 RMD(Right Most Derivation)中的前一个右序列形式。
句型:这里是S => a,'a'称为句型,'a'可以是终结符和非终结符的混合。
例子:
Consider Grammar : S -> aSa | bSb | ε
Derivation: S => aSa => abSba => abbSbba => abbbba
左句和右句形式:
- 左句式是出现在某个句子的最左派生词中的句式。
- 右句式是出现在某个句子的最右派生中的句式。
句柄包含两件事:
- 生产
- 位置
例子:
S -> aABe
A -> Abc | b
B -> d
脚步:
abbcde : γ = abbcde , A->b; Handle = b
aAbcde : γ = RHS = aAbcde , A->Abc; Handle = Abc
aAde : γ = aAde , B->d; Handle = d
aABe : γ = aABe, S-> aABe; Handle = aABe
注意-句柄在右句形式中带有下划线。
是否总是处理最左边的子字符串?
不,总是选择最左边的子字符串作为句柄,可能不会给出正确的 SR(Shift-Reduce) Parsing。
处理修剪:
从解析树中删除左侧非终端的孩子称为Handle Pruning 。
可以通过句柄修剪获得最右边的反向推导。
要遵循的步骤:
- 从要解析的字符串终端“w”开始。
- 令 w = γ n ,其中 γ n是未知 RMD 的第 n 个右序列形式。
- 要反向重建 RMD,请将句柄 βn 定位在 γ n中。用一些 A n ⇢ βn 的 LHS 替换 βn 以获得 (n-1) th RSF γ n-1。重复。
示例 1:Right Sequential Form Handle Reducing Production id + id * id id E ⇒ id E + id * id id E ⇒ id E + E * id id E ⇒ id E + E * E E + E E ⇒ E + E E * E E * E E ⇒ E * E E (Root)
示例 2:Right Sequential Form Handle Production id + id + id id E ⇒ id E + id + id id E ⇒ id E + E + id id E ⇒ id E + E + E E + E E ⇒ E + E E + E E + E E ⇒ E + E E (Root)