實驗2 遞迴下降語法分析程式設計

2021-10-08 01:21:42 字數 4231 閱讀 9983

【開發語言及實現平台或實驗環境】

c++/clion

【實驗目的】

(1)理解語法分析在編譯程式中的作用,以及它與詞法分析程式的關係

(2)加深對遞迴下降語法分析原理的理解

(3)掌握遞迴下降語法分析的實現方法

【實驗內容】

編制乙個遞迴下降分析程式,實現對詞法分析程式提供的單詞序列的語法檢查和結構分析。

【實驗要求】

(1)待分析的簡單語言的詞法同實驗1

(2)待分析的簡單語言的語法

用擴充的bnf表示如下:

1)《程式》::=begin《語句串》end

2) 《語句串》::=《語句》

3) 《語句》::=《賦值語句》

4) 《賦值語句》::=id:=《表示式》

5) 《表示式》::=《項》

6) 《項》::=《因子》

7) 《因子》::=id|num|(《表示式》)

(3)語法分析程式的功能

輸入單詞串以」#」結束,如果是文法正確的句子,輸出成功資訊;否則輸出錯誤資訊。

例如:輸入 begin a:=9; x:=2 * 3; b:=a + x end #

輸出 success

輸入 x:=a + b * c end #

輸出 error

【實驗步驟】

yucu()

//語句串分析函式

return;}

statement()

else

}else

return

;}

2)編寫表示式分析過程

3)編寫項分析過程

4)編寫因子分析過程

(3)除錯程式,驗證輸出結果

【實驗**】

#include

#include

#include

using namespace std;

char prog[80]

, token[8]

;char ch;

int syn, p, m, n, sum, kk;

char

*pstring[6]

=;intscanner()

;//呼叫scanner函式

intlrparscr()

;//呼叫lrparscr函式

intyucu()

;//呼叫yucu函式

intstatement()

;//呼叫statement函式

intexpression()

;//呼叫expression函式

intterm()

;//呼叫term函式

intfactor()

;//呼叫factor函式

intmain()

while

(ch !=

'#')

; p =0;

kk =0;

scanner()

;lrparscr()

;getchar()

;getchar()

;return0;

}int

lrparscr()

else

if(kk !=1)

}else

return0;

}int

yucu()

return0;

}int

statement()

else

}else

return0;

}int

expression()

return0;

}int

term()

return0;

}int

factor()

}else

return0;

}int

scanner()

if((ch >=

'a'&& ch <=

'z')

||(ch >=

'a'&& ch <=

'z')

) token[m++]=

'\0'

;//單詞結束

p--;//回退乙個字元

syn =10;

//識別符號

for(n =

0; n <

6; n++

)//與關鍵字表進行比較,確定syn的值if(

strcmp

(token, pstring[n])==

0)}elseif(

(ch >=

'0'&& ch <=

'9'))}

p--;//回退乙個字元

syn =11;

//數字字元

if(sum >

32767

) syn =-1

;//出現錯誤

}else

switch

(ch)

else

if(ch ==

'=')

else

break

;case

'>'

: m =0;

token[m++

]= ch;

ch = prog[p++];

//讀下乙個單詞符號並賦給ch

if(ch ==

'=')

else

break

;case

':':

m =0;

token[m++

]= ch;

ch = prog[p++];

//讀下乙個單詞符號並賦給ch

if(ch ==

'=')

else

break

;case

'+':

syn =13;

token[0]

= ch;

break

;case

'-':

syn =14;

token[0]

= ch;

break

;case

'*':

syn =15;

token[0]

= ch;

break

;case

'/':

syn =16;

token[0]

= ch;

break

;case

'=':

syn =25;

token[0]

= ch;

break

;case

';':

syn =26;

token[0]

= ch;

break

;case

'(':

syn =27;

token[0]

= ch;

break

;case

')':

syn =28;

token[0]

= ch;

break

;case

'#':

syn =0;

token[0]

= ch;

break

;case

'\n'

: syn =-2

;break

;default

: syn =-1

;break;}

return syn;

}

【執行結果】

遞迴下降語法分析實驗

通過設計 開發乙個高階語言的遞迴下降語法分析程式,實現 對詞法分析程式所提供的單詞序列進行語法檢查和結構分析,加 深對相關課堂教學內容的理解,提高語法分析方法的實踐能力。1 理解語法分析在編譯程式中的作用,以及它與詞法分析程式的 關係 2 掌握遞迴下降語法分析方法的主要原理 3 理解遞迴下降分析法對...

編譯原理 實驗2 遞迴下降語法分析程式設計

實驗要求 1 待分析的簡單語言的詞法同實驗1 2 待分析的簡單語言的語法 用擴充的bnf表示如下 1 程式 begin 語句串 end 2 語句串 語句 3 語句 賦值語句 4 賦值語句 id 表示式 5 表示式 項 6 項 因子 7 因子 id num 表示式 3 語法分析程式的功能 輸入單詞串以...

實驗二 遞迴下降語法分析

一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...