如何使它能够使用LALR解决1

问题描述

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

我已经完成了LR(1)解析表的工作,并且还证明这不是LALR(1),但是有什么方法可以使其成为LALR(1)吗?

解决方法

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

问题是:

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

示例

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

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

第二个:

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

解决方案

我们的语法中必须有一个q。 因此我们的y和z变为:

enter image description here

所以现在总是输入字符串“ qa”:

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

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

enter image description here

并像这样更改x:

enter image description here

立即可以理解,这种生成方式也是模棱两可的,因此得出的结论是,可以将每个LALR解析器转换为LR解析器,反之则不能