编译原理预测分析法c语言,编译原理预测分析法C语言的实验报告.doc
題目:編寫識別由下列文法所定義的表達式的預測分析程序。
EàE+T | E-T | T
TàT*F | T/F |F
Fà(E) | i
輸入:每行含一個表達式的文本文件。
輸出:分析成功或不成功信息。
?? (題目來源:編譯原理實驗(三)--預測(LL(1))分析法的實現)
?
解答:
?
(1)分析
a) ∵E=>E+T=>E+T*F=>E+T*(E)即有E=>E+T*(E)存在左遞歸。用直接改寫法消除左遞歸,得到如下:
E à TE’ E’ à +TE’ | ?TE’|ε
T à FT’ T’ à *FT’ | /FT’|ε
F à (E) | i
對于以上改進的方法。可得:
對于E’:?FIRST( E’ )=FIRST(+TE’)∪FIRST(-TE’)∪{ε}={+,?,ε}
對于T’:FIRST( T’ )=FIRST(*FT’)∪FIRST(/FT’)∪{ε}={*,∕,ε}
而且:FIRST( E ) = FIRST( T ) = FIRST( F )=FIRST((E))∪FIRST(i)={(,i }
由此我們容易得出各非終結符的FOLLOW集合如下:
FOLLOW( E )= { ),#}
FOLLOW(E’)= FOLLOW(E)={ ),#}
FOLLOW( T )= FIRST(E’)\ε∪FOLLOW(E’)={+,?,),#}
FOLLOW( T’ ) = FOLLOW( T ) ={+,?,),#}
FOLLOW( F )=FIRST(T’)\ε∪FOLLOW(T’)={*,∕,+,?,),#}
由以上FOLLOW集可以我們可以得出SELECT集如下:
對ESELECT(EàTE’)=FIRST(TE’)=FIRST(T)={ (,i }
對E’ SELECT(E’ à+TE’)={ + }
SELECT(E’ à ?TE’)={ ? }
SELECT(E’ àε)={ε,),#}
對TSELECT(TàFT’)={(,i}
對T’ SELECT(T’ à*FT’)={ * }
SELECT(T’ à ∕FT’)={ ∕ }
SELECT(T’ àε)={ε,+,?,),#}
對FSELECT(Fà(E) )={ ( }
SELECT(Fài)={ i }
∴ SELECT(E’ à+TE’)∩SELECT(E’ à ?TE’)∩SELECT(E’ àε)=F
SELECT(T’ à*FT’)∩SELECT(T’ à ∕FT’)∩SELECT(T’ àε)=F
SELECT(Fà(E) )∩SELECT(Fài)= F
由上可知,有相同左部產生式的SELECT集合的交集為空,所以文法是LL(1)文法。
?
b) 由Select集構造文法LL(1)的預測分析表 (表1)
非終
結符
終結符
i
+
-
*
/
(
)
#
ε
E
E >TE’[0]
E->TE’[5]
E’
E’-> + T E’[11]
E’-> - TE’[12]
E’->ε[16]
E’->ε[17]
E’->ε[18]
T
T->FT’[20]
T->FT’[25]
T’
T’->ε[31]
T’->ε[32]
T’->*FT’[33]
T’->/FT’[34]
T’->ε[36]
T’->ε[37]
T’->ε[38]
F
F->i[40]
F->(E)[45]
表1. LL(1)預測分析表
?
(2)設計
算法的主要流程圖(如:圖1)。
圖1.流程圖
?
(3)程序代碼如下
/************************************************************************
*文件名:test3.c
*文件描述:預測分析法實現的語法分析器。分析如下文法:
* E->E+T | E-T | T
* T->T*F | T/F |F
* F->(E) | i
* 輸入:每行含一個表達式的文本文件(#號結束)。
* 輸出:分析成功或不成功信息。
*創建人:余洪周 2006-12-16
*版本號:1.0?
*說明 :為了表示的方便采用了如下的所示表示方法:
*? A=E' B=T'
?* 非終結符:0=E1=E' 2=T 3=T'
總結
以上是生活随笔為你收集整理的编译原理预测分析法c语言,编译原理预测分析法C语言的实验报告.doc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软对键盘上的Page Up Page
- 下一篇: c语言vs开发小型数据库,用C语言开发小