簡體   English   中英

編譯器:不包含epsilon的語法的第一套和第二套

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM