首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >制作语法LL(1)

制作语法LL(1)
EN

Stack Overflow用户
提问于 2013-03-01 23:52:30
回答 1查看 4.1K关注 0票数 8

我有以下语法:

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

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

S-> aSbT | epsilon

T-> bFaF| epsilon

F-> epsilon

有人能帮上忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-02 09:44:43

在他的original paper on LR parsing中,Knuth给出了这种语言的以下语法,他猜想“这是这种语言最简短、最明确的语法:”

S→ε| aAbS | bBaS

aAbA |→ε

B→ε|B

直观地说,这试图将任何A和B字符串分解成完全平衡的块。有些块以a开头,以b结尾,而另一些块则以b开头,以a结尾。

我们可以先计算集合,然后再计算,如下所示:

优先(S)={ε,a,b}

FIRST(A) ={ε,a}

FIRST(B) ={ε,b}

FOLLOW(S) ={$}

FOLLOW(A) ={b}

跟随(B)={a}

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

代码语言:javascript
复制
   |   a   |   b   |   $   
 --+-------+-------+-------
 S | aAbS  | bBaS  |  e
 A | aAbA  |   e   |
 B |   e   | bBaB  |

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

希望这能有所帮助!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15161636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档