採用至少一種句法分析技術(ll(1)、slr(1)、lr(1)或lalr(1))對類高階語言中的基本語句進行句法分析。闡述句法分析系統所要完成的功能。
(1)能識別以下幾類語句:
宣告語句(包括變數宣告、陣列宣告、記錄宣告和過程宣告)
表示式及賦值語句(包括陣列元素的引用和賦值)
分支語句:if_then_else
迴圈語句:do_while
過程呼叫語句
(2)自動計算first集和follow集,自動生成**分析表
(3)具備語法錯誤處理能力,能準確給出錯誤所在位置,並採用可行的錯誤恢復策略。
(4)通過檔案匯入文法和測試用例,可以通過使用者介面顯示並編輯測試用例。
(5)列印輸出語法分析器的first集、follow集和ll(1)分析表(或lr分析表)。另一部分是列印輸出語法分析結果。
我選的是lr(1)分析
關於用檔案匯入產生式,如何才能在檔案中區分終結符和非終結符呢?
答:產生式格式如下設計
start p
p dp s
s s sdd
dd proc id ; d s
d t id ;
t x c
t record d
x int
x real
c [ num ] c
cs id = e ;
s l = e ;
ee + e
ee * e
e - e
e ( e )
e id
e digit
e ll id [ e ]
l l [ e ]
s if b then s
s if b then s else s
s while b do s
b b || b
b b && b
b ! b
b ( b )
b e< e
b e<= e
b e == e
b e != e
b e > e
b e >= e
s id ( elist )
elist elist , e
elist e
每一行表示乙個產生式,然後非終結符的第乙個字母都是大寫,終結符的第乙個字母小寫。每行的第乙個單詞為產生式左部,其他為產生式右部,這樣設計很方便讀取。下面是老師給的原文法
要求:給出如下語言成分的文法描述。
宣告語句(包括變數宣告、陣列宣告、記錄宣告和過程宣告)
表示式及賦值語句(包括陣列元素的引用和賦值)
分支語句:if_then_else
迴圈語句:do_while
過程呼叫語句
/*宣告*/
d → d
d | proc id ; d s | t id;
t → x c | record d
x → integer | real
c → [num]c | ε
/*賦值語句*/
s → id = e ;| l = e ;
e → e + e | e * e | -e | (e) | id | digit | l
l → id[e] | l[e]
/*控制流語句*/
s → if b then s1
| if b then s1 else s2
| while b do s1
b → b or b
| b and b
| not b
| (b)
| e relop e
| true
| false
relop → < | <= | == | != | > | >=
/* 過程呼叫*/
s →call id (elist)
elist→ elist, e
elist → e
編譯原理 語法分析器
當乙個文法滿足ll 1 條件時,我們就可以為它構造乙個不帶回溯的自上而下分析程式,這個分析程式是由一組遞迴過程組成的,每個過程對應文法的乙個非終結符。這樣的乙個分析程式成為遞迴下降分析器。例 乙個支援 的簡單文法為 用 表示空字元 e te e te t ft t ft f e i 編譯原理 第三版...
編譯原理實驗 語法分析器
待分析的簡單語言的語法 用擴充的bnf表示如下 程式 begin 語句串 end 語句串 語句 語句 賦值語句 賦值語句 id 表示式 表示式 項 項 因子 關鍵字表 int syn,p,m,n,sum syn是種別碼,p為prog陣列的指標,m為token陣列的指標,n為rwtab陣列的指標,su...
編譯原理 LL(1)語法分析器
1.專案要求 文法要求 1 從檔案讀入,每條產生式占用一行 2 文法為ll 1 文法 從檔案中讀入文法,從鍵盤上輸入待分析的符號串,採用 ll 1 分析演算法判斷該符號串是否為該文法的句子。2.實驗思路 首先實現集合first x 構造演算法和集合follow a 構造演算法,再根據first和fo...