[英]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.