Viable Prefix是一个正确的句子形式的前缀,它不会继续超过该句子形式最右边句柄的右端。
这显然意味着一个可行的前缀在其最右端有一个句柄。并非所有正确的句子形式的前缀都可以出现在移位归约解析器的堆栈中。
这可以在以下示例的帮助下显示。
例子 –
A=>B+id=>(E)+id
(rightmost derivation, sentential form)
自底向上解析器给出反向最右推导,因此在上面的示例中,如果我们在反向最右推导过程中得到字符串(E)+id,则执行以下操作:
Operation performed | Stack | Comments |
---|---|---|
(.E)+id | ( | shift ( |
(E.)+id | ( E | shift E |
(E).+id | ( E ) | shift ) |
B.+id | B | reduce (E) to B |
B+.id | B + | shift + |
B+id. | B + id | shift id |
A | A | reduce B + id to A |
正如我们在上表中看到的,在将 + 移入堆栈之前,我们已将 (E) 减少到 B。 E) 是一个句柄,堆栈中的项目不能超出句柄。所以这里 (, (E, (E) 都是句柄 (E) 的所有可用前缀,并且只有这些前缀出现在 shift reduce 解析器的堆栈中。
所以我们一直在移动项目,直到我们到达句柄或发生错误。一旦到达句柄,我们使用合适的生产方式用非终端来减少它。因此,可行的前缀有助于做出适当的移位减少决策。只要堆栈包含这些前缀,就不会出现任何错误。
LR(0) 自动机可以识别所有可行前缀。因此,给定 SLR(1) 解析器的可行前缀集是一种常规语言。堆栈与有限状态机的这种组合实际上是一个下推自动机实际上用于识别上下文无关语言。
以下示例说明了给定语法的所有可行前缀。
例子 –
给定语法:
S -> AA
A -> bA | a
给定字符串–
bbbaa
解决方案 :
众所周知,对于给定的语法,自底向上的解析是字符串最右边推导的反向。所以我们使用字符串的最右边推导来演示这个例子。
S.No. | Reverse Rightmost Derivation with Handles | Viable Prefix | Comments |
---|---|---|---|
1. | S -> bbbaa | b, bb, bbb, bbba | Here, a is the handle so viable prefix cannot exceed beyond a. |
2. | S -> bbbAa | b, bb, bbb, bbbA | Here, bA is the handle so viable prefix cannot exceed beyond bA. |
3. | S -> bbAa | b, bb, bbA | Here also, bA is the handle so viable prefix cannot exceed beyond bA. |
4. | S -> bAa | b, bA | Here also, bA is the handle so viable prefix cannot exceed beyond bA. |
5. | S -> Aa | A, Aa | Here, a is the handle so viable prefix cannot exceed beyond a. |
6. | S -> AA | A, AA | Here, AA is the handle so viable prefix cannot exceed beyond AA. |