[英]Compilers: First and Follow Sets of a grammar that does not contain epsilon
在当前的编译器课程中,我已经了解了如何查找语法的第一套和第二套,到目前为止,我所处理的所有语法都包含epsilon。 现在,我被要求查找没有epsilon的第一个和第二个语法集,并确定它是LR(0)和SLR。 没有epsilon会让我失望,所以我不知道我做得是否正确。 对于我是否在第一个和第二个集合上都处在正确的轨道上,以及如何开始确定它是否为LR(0),我将不胜感激。
考虑以下描述Lisp算术的语法:
S-> E // S是开始符号,E是表达式
E->(FL)// F是数学函数,L是列表
L-> LI | 我//我是列表中的一个项目
I-> n | E //一个项目是数字n或表达式E
F-> + | -| *
第一:
FIRST(S)= FIRST(E)= {(}
FIRST(L)= FIRST(I)= {n,(}
FIRST(F)= {+,-,*}
跟随:
跟随= {$}
FOLLOW(E)= FOLLOW(L)= {),n,$}
FOLLOW(I)= {),$}
FOLLOW(F)= {),$}
第一组是正确的,但跟随组是不正确的。
FOLLOW(S)= {$}是正确的,尽管从技术上讲这是针对扩展语法S'-> S $。
E出现在S-> E和I-> E的右侧,这两者都意味着该集合的跟随在E的跟随中,因此:FOLLOW(E)= FOLLOW(S)∪FOLLOW(I) 。
L出现在L-> LI的右侧,给出FOLLOW(L)⊇FIRST(I),而E->(FL)给出FOLLOW(L)⊇{)}。
我出现在L-> LI |的右侧。 I,它给出FOLLOW(I)= FOLLOW(L)。
F出现在E->(FL)的右侧,这给出FOLLOW(F)= FIRST(L)
解决这些问题得到:
FOLLOW(F)= {n,(}
FOLLOW(L)= FIRST(I)∪{}} = {n,(,)}
FOLLOW(I)= {n,(,)}
FOLLOW(E)= {$}∪{n,(,)} = {n,(,),$}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.