可行前缀是正确句型形式的前缀,该前缀不能继续超过该特定句型形式的最右边句柄的右端。
显然,这意味着可行的前缀在其最右端具有句柄。并非所有具有正确句子形式的前缀都可以出现在shift reduce解析器的堆栈中。
可以在以下示例的帮助下进行显示。
例子 –
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)是一个句柄,并且堆栈中的项不能超出该句柄。因此,此处(,(E,(E)是句柄(E)的所有可行前缀,并且在shift reduce解析器的堆栈中仅存在这些前缀。
因此,我们将继续移动物品,直到到达手柄或发生错误。一旦达到手柄,我们将使用合适的产品以非终端方式减少手柄。因此可行的前缀有助于做出适当的移位减少决策。只要堆栈包含这些前缀,就不会有任何错误。
LR(0)自动机可以识别所有可行的前缀,因此给定SLR(1)解析器的可行前缀集是一种常规语言。堆栈与有限状态机的这种组合实际上是下推式自动机实际上用于识别上下文无关的语言。
以下示例说明了给定语法的所有可行前缀。
例子 –
给定语法:
S -> AA
A -> bA | a
给定字符串–
bbbaa
解决方案 :
正如我们所知道的是自下而上的分析是给定grammar.So字符串的最右推导的逆我们使用字符串的反向最右推导证明这一点的例子。
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. |