如何将这个语法转换为LL(1)?

时间:2015-04-01 20:08:42

标签: parsing automata ll

S→Y | 1X

X→1X | 0

Y→Y 0 | 1X1 | 2X2

当有多个相同的符号时,我不明白如何进行分解或替换。感谢你。

1 个答案:

答案 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* | Ɛ