S→Y | 1X
X→1X | 0
Y→Y 0 | 1X1 | 2X2
当有多个相同的符号时,我不明白如何进行分解或替换。感谢你。
答案 0 :(得分:0)
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* | Ɛ