【发布时间】:2015-04-01 20:08:42
【问题描述】:
S → Y | 1X
X → 1X | 0
Y → Y 0 | 1X1 | 2X2
当有多个相同符号时,我不明白如何进行因式分解或替换。谢谢你。
【问题讨论】:
S → Y | 1X
X → 1X | 0
Y → Y 0 | 1X1 | 2X2
当有多个相同符号时,我不明白如何进行因式分解或替换。谢谢你。
【问题讨论】:
X → 1 X | 0
指的是 0 个或多个 1 后跟 0,所以它相当于
X → 1* 0
同样的方法可以用来移除你的左递归。你可以重写
S → Y | 1 X
X → 1 X | 0
Y → Y 0 | 1 X 1 | 2 X 2
作为
S → Y | 1 X
X → 1* 0
Y → ( 1 X 1 | 2 X 2 )* 0
在 EBNF 中:
S → Y | 1 X
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
在 BNF 中:
S → Y | 1 X
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
1* → 1 1* | Ɛ
A* → A A* | Ɛ
如果您只想消除左递归,那么您就完成了。
如果您还想消除常见前缀,您还没有完成,因为S 的两个子规则都可以以1 X 开头。要解决此问题,请内联并分发以获取以下内容:
S → 0
| 1 X 1 Y
| 2 X 2 Y
| 1 X
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
现在,我们终于可以分解常见的1 X了。
S → 0
| 1 X ( 1 Y )?
| 2 X 2 Y
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
在 EBNF 中:
S → 0 | 1 X B? | 2 X 2 Y
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
B → 1 Y
在 BNF 中:
S → 0 | 1 X B? | 2 X 2 Y
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
B → 1 Y
B? → B | Ɛ
1* → 1 1* | Ɛ
A* → A A* | Ɛ
【讨论】: