编译器:First和Follow不包含epsilon的语法集

时间:2016-03-23 21:53:35

标签: parsing compiler-construction

在我目前的编译器课程中,我已经理解了如何找到第一个和后面的语法集,到目前为止我处理的所有语法都包含epsilon。现在我被要求在没有epsilon的情况下找到第一个和后面的语法集,并确定它是LR(0)还是SLR。没有epsilon让我失望,所以我不知道我是否已经正确地完成了它。我很感激任何关于我是否在第一组和第一组都在正确的轨道上的评论,以及如何开始确定它是否为LR(0)

考虑以下描述Lisp算法的语法:

S - > E // S是起始符号,E是表达式

E - > (FL)// F是数学函数,L是列表

L - >李|我//我是列表中的项目

我 - > n | E //项目是数字n或表达式E

F - > + | - | *

FIRST:

FIRST(S)= FIRST(E)= {(}

FIRST(L)= FIRST(I)= {n,(}

FIRST(F)= {+, - ,*}

如下:

关注(S)= {$}

跟随(E)=跟随(L)= {),n,$}

关注(I)= {),$}

关注(F)= {),$}

1 个答案:

答案 0 :(得分:0)

FIRST集是正确的,但FOLLOW集是不正确的。

FOLLOW(S)= {$}是正确的,但从技术上讲,这是针对增强语法S' - > S $。

E出现在S - >的右侧; E和我 - > E,两者都意味着该组的跟随在E的后面,所以:跟随(E)=跟随(S)∪跟随(I)。

L出现在L - >的右侧。 LI,给出跟随(L)⊇第一(I),和E - > (FL),它给出了FOLLOW(L)⊇{)}。

我出现在L - >的右侧。李|我,它给出了跟随(I)=跟随(L)。

F出现在E - >的右侧。 (FL),给出FOLLOW(F)= FIRST(L)

解决这些问题:

关注(F)= {n,(}

跟随(L)=第一(I)∪{)} = {n,(,)}

关注(I)= {n,(,)}

关注(E)= {$}∪{n,(,)} = {n,(,),$}