制作语法LL(1)

时间:2013-03-01 15:52:30

标签: parsing programming-languages grammar context-free-grammar ll

我有以下语法:

S→a S b S | b S a S | ε

因为我正在尝试为它编写一个小编译器,所以我想把它变成LL(1)。我看到这里似乎存在FIRST / FOLLOW冲突,我知道我必须使用替换来解决它,但我不确定如何解决它。这是我提出的语法,但我不确定它是否正确:

S-> aSbT |小量

T-> bFaF |小量

F->小量

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:5)

在他的original paper on LR parsing中,Knuth为这种语言提供了以下语法,他猜想“这是这种语言最简洁的语法:”

  

S→ε| aAbS | BBAS

     

A→ε| AABA

     

B→ε| BBAB

直观地说,这会尝试将任何As和Bs串分解为完全平衡的块。一些块以a开头,以b结尾,而其他块以b开头,以。结束。

我们可以按如下方式计算FIRST和FOLLOW集:

  

FIRST(S)= {ε,a,b}

     

FIRST(A)= {ε,a}

     

FIRST(B)= {ε,b}

     

关注(S)= {$}

     

关注(A)= {b}

     

关注(B)= {a}

基于此,我们得到以下LL(1)解析表:

   |   a   |   b   |   $   
 --+-------+-------+-------
 S | aAbS  | bBaS  |  e
 A | aAbA  |   e   |
 B |   e   | bBaB  |

所以这个语法不仅是LR(1),而且它也是LL(1)。

希望这有帮助!