我怎样才能让它能够用 LALR(1) 求解

How Can I make it able to solve with LALR(1)

*X-> Ya| cYb | Zb | cZa
Y-> q | Eplison | XaZ
Z-> f | q*

我已经完成了 LR(1) 解析 table 并且还证明这不是 LALR(1) 但是有什么方法可以使它能够使 LALR(1) 为这个?

您必须消除语法的歧义,因为 LALR 解析器仅适用于无歧义的语法。

问题是:

  • 当我们使用 LALR(1) 解析器读取 q(对于您的语法)时,我们无法理解派生、y 或 z 的位置,因此我们必须解决这个问题

示例

让字符串“qa”成为语法的输入字符串: 我们有两种情况,第一种:

|---------------------|------------------|
|      terminal       |     character    |
|---------------------|------------------|
|                     |         q        |
|---------------------|------------------|
|---------------------|------------------|
|           q         |         a        |
|---------------------|------------------|
|---------------------|------------------|
|           y         |         a        |
|---------------------|------------------|
|---------------------|------------------|
|           ya        |                  |
|---------------------|------------------|
|---------------------|------------------|
|           x         |                  |
|---------------------|------------------|

第二个:

|---------------------|------------------|
|      terminal       |     character    |
|---------------------|------------------|
|                     |         q        |
|---------------------|------------------|
|---------------------|------------------|
|           q         |         a        |
|---------------------|------------------|
|---------------------|------------------|
|           z         |         a        |
|---------------------|------------------|
|---------------------|------------------|
|           za        |                  | <--- there your parser stuck
|---------------------|------------------|

解决方案

我们的语法中必须有一个问题。 所以我们的 y 和 z 变成:

所以现在总是针对字符串“qa”:

|---------------------|------------------|
|      terminal       |     character    |
|---------------------|------------------|
|                     |         q        |
|---------------------|------------------|
|---------------------|------------------|
|           q         |         a        |
|---------------------|------------------|
|---------------------|------------------|
|           D         |         a        |
|---------------------|------------------|
|---------------------|------------------|
|           Da        |                  |<--- there your parser stuck
|---------------------|------------------|

所以我们的解析器又卡住了? 不幸的是,是的,因为现在 d 在 y 和 z 中都存在,所以我们可以尝试像这样统一它们:

并像这样更改 x:

立即可以理解这个产生式也是模棱两可的,所以结论是每个 LALR 解析器都可以转换为 LR 解析器,但反之则不行