編譯原理語法分析器

2021-07-24 06:50:10 字數 2715 閱讀 5350

採用至少一種句法分析技術(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...