我怎样才能让它能够用 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 解析器,但反之则不行
*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 解析器,但反之则不行