【開發語言及實現平台或實驗環境】
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集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...