




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編譯原理實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)題目:詞法分析器構(gòu)造指導(dǎo)教師:楊建,趙會(huì)群姓名: 班級(jí):學(xué)號(hào):實(shí)驗(yàn)成績(jī):實(shí)驗(yàn)題目語(yǔ)法分析器構(gòu)造實(shí)驗(yàn)?zāi)康暮鸵蠼柚谠~法分析程序提供的分析結(jié)果,編寫(xiě)一個(gè)算符優(yōu)先語(yǔ)法分析程序,程序能進(jìn)行語(yǔ)法結(jié)構(gòu)分析和錯(cuò)誤檢查并產(chǎn)生相應(yīng)的歸約信息。同時(shí)給出出錯(cuò)信息和錯(cuò)誤類型,從而加深對(duì)語(yǔ)法分析的理解。設(shè)計(jì)思想與框架1.本實(shí)驗(yàn)的優(yōu)先表可以手工先設(shè)計(jì)好:算符優(yōu)先關(guān)系表- + - * / ( ) i #+ > > < < < > < >- > > < < < > < >* > > > &g
2、t; < > < >/ > > > > < > < >( < < < < < = < ?) > > > > ? > ? >i > > > > ? > ? ># < < < < < ? < =-算術(shù)表達(dá)式->項(xiàng)|算術(shù)表達(dá)式+項(xiàng)|算術(shù)表達(dá)式-項(xiàng)項(xiàng)->因子|項(xiàng)*因子|項(xiàng)/因子因子->變量|常數(shù)|(算術(shù)表達(dá)式)2.本實(shí)驗(yàn)要求中提出的“產(chǎn)出相應(yīng)的歸約信息”意指在語(yǔ)法分析的過(guò)
3、程中,一旦產(chǎn)生歸約,在程序上產(chǎn)生并最終輸出歸約產(chǎn)生式序號(hào)。3.出錯(cuò)類型的產(chǎn)生可預(yù)先對(duì)應(yīng)優(yōu)先表中出錯(cuò)欄列表說(shuō)明其出錯(cuò)類型,并分別編序,當(dāng)分析中產(chǎn)生錯(cuò)誤時(shí)以字符串輸出相應(yīng)表中錯(cuò)誤信息。核心算法算法采用一個(gè)符號(hào)棧的數(shù)據(jù)結(jié)構(gòu),既用它存放終結(jié)符,也用它存放非終結(jié)符。設(shè)K為符號(hào)棧使用深度,其參考算法如下:K:=1 SK:=#Repeat把下一人輸入符讀入a中If SKVT then j:=K else j:=K-1While Sj>a doBeginRepeatQ:=SjIf Sj-1VT then j:=j-1 else j:=j-2Until Sj<Q把Sj+1SK歸約為某個(gè)N記錄歸約產(chǎn)生
4、式序號(hào)K:=j+1SK:=NEnd of while If Sj<a OR Sj=a thenBeginK:=K+1; SK:=aEnd Else ERROR 查表打印出錯(cuò)信息Until a='#'輸出歸約產(chǎn)生式序列號(hào);源程序及注釋#include <iostream>#include <cstdio>#include <iomanip>using namespace std;#define N 100#define NULL 0FILE *fp;/預(yù)處理文件指針/定義符號(hào)棧的大小與輸入字符串的大小以及算術(shù)表達(dá)式字符串的大小char s
5、tackN,stringsN,oldstringsN;char a;int top=-1,k=0,step=1,n=0,NoN,id=1;/二維數(shù)組定義字符之間的優(yōu)先關(guān)系(1表示>,-1表示<,0表示=,-2表示錯(cuò)誤)int MNN=1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,0,-1,-2,1,1,1,1,-2,1,-2,1,1,1,1,1,-2,1,-2,1,-1,-1,-1,-1,-1,-2,-1,0; char *word6="
6、N+N","N-N","N*N","N/N",")N(","i"/可歸約字符串int print(int t,int m) cout<<"n "<<step+<<setw(10); cout<<stack<<setw(10); if(m=1) cout<<">"<<setw(8); else if(m=0) cout<<"="
7、<<setw(8); else cout<<"<"<<setw(8); cout<<a<<setw(10); cout<<&stringsk<<setw(10); if(t) cout<<"歸約"<<setw(8); Non+=step-1; else cout<<"移進(jìn)"<<setw(8); return 0;void push(char ch) stack+top=ch;char pop
8、()char a;a=stacktop-;stacktop+1='0' return a;int ch_di(char ch) switch(ch) case'+': return 1; case'-': return 2; case'*': return 3; case'/': return 4; case'(': return 5; case')': return 6; case'i': return 7;case'#': return 8; de
9、fault: return 0;int IsVT(char ch) if(ch='N') return 0; else return 1;int readvt(char *a) if(IsVT(stringsk) (*a)=stringsk; k+; return 1; else k+; return 0;int big(int t,char a) if(Mch_di(stackt)-1ch_di(a)-1=1)return 1;elsereturn 0;int less(int t,char a) if(Mch_di(stackt)-1ch_di(a)-1=-1)return
10、 1;elsereturn 0;int equal(int t,char a) if(Mch_di(stackt)-1ch_di(a)-1=0)return 1;elsereturn 0;void error(int t) if(ch_di(stackt)=6|ch_di(stackt)=7) printf("n錯(cuò)誤e2:缺少運(yùn)算符!");else if(ch_di(stackt)=5)printf("n錯(cuò)誤e1:非法左括號(hào)!");else printf("n錯(cuò)誤e3:非法右括號(hào)!");void prior_analysis() in
11、t i,j,m; char q,str,ch20; push('#');print(0,-1);for(;)/*u:*/ readvt(&a); if(IsVT(stacktop) j=top; else j=top-1;do while(big(j,a)&&strcmp(stack,"#N")!=0) do q=stackj; if(IsVT(stackj-1) j=j-1; else j=j-2;while(!less(j,q);i=-1;while(top-j)!=0) ch+i=pop();chi+1='0'f
12、or (m=0;m<=5;m+)if(strcmp(wordm,ch)=0)str='N'push(str); print(1,1); if(less(j,a) push(a);print(0,-1);if(stacktop!='#')/goto u;break; else if(equal(j,a) push(a);print(0,0); if(stacktop!='#')/goto u;break;elseerror(j);a='#'while(a!='#');if(a='#')break
13、;void main() cout<<"*算符優(yōu)先語(yǔ)法分析程序*"<<endl;cout<<" E->E+T|E-T|T"<<endl;cout<<" T->T*F|T/F|F"<<endl;cout<<" F->(E)|i"<<endl;cout<<" E表示算術(shù)表達(dá)式.T表示項(xiàng).F表示因子.i表示變量或常數(shù)."<<endl;cout<<&quo
14、t; 優(yōu)先表"<<endl;cout<<" + - * / ( ) i #"<<endl;cout<<" + > > < < < > < >"<<endl; cout<<" - > > < < < > < >"<<endl;cout<<" * > > > > < > < >&qu
15、ot;<<endl;cout<<" / > > > > < > < >"<<endl;cout<<" ( < < < < < = < e1"<<endl;cout<<" ) > > > > e2 > e2 >"<<endl;cout<<" i > > > > e2 > e2 >
16、"<<endl;cout<<" # < < < < < e3 < ="<<endl;if(fp=fopen("預(yù)處理.txt","r")=NULL)cout<<"請(qǐng)先將實(shí)驗(yàn)文件夾中的預(yù)處理.txt文件復(fù)制到實(shí)驗(yàn)文件夾中!"<<endl;system("pause"); exit(0);char ch=fgetc(fp);char ch1;while(ch!='#') int
17、i=-1,j=0,m=-1; while(ch!='='&&ch!='#') ch1=ch; ch=fgetc(fp);if(ch1='>'|ch1='<')&&ch='=')ch=fgetc(fp); if(ch='#') cout<<"算符優(yōu)先語(yǔ)法分析結(jié)束!"<<endl;fclose(fp); system("pause");exit(0); while(ch!=' '&
18、amp;&ch!='#') ch=fgetc(fp); oldstrings+i=ch; oldstringsi='0' if(isalnum(oldstringsj) strings+m='i' else strings+m=oldstringsj; j+; while(oldstringsj!='0') if(isalnum(oldstringsj) if(isalnum(oldstringsj-1)=0) strings+m='i' else strings+m=oldstringsj; j+; st
19、ringsm+1='#' stringsm+2='0' cout<<"算術(shù)表達(dá)式"<<id<<"為: "<<oldstrings<<endl; cout<<"轉(zhuǎn)換為輸入串: "<<strings<<endl; cout<<" 步驟號(hào)符號(hào)棧優(yōu)先關(guān)系當(dāng)前分析符剩余輸入串動(dòng)作" prior_analysis(); n=0; cout<<endl; cout<<"算術(shù)表達(dá)式"<<id+<<"的"<<"歸約產(chǎn)生式步驟號(hào)為:" while(Non) cout<<" "<<Non; n+;cout<<endl; while(stack0!='0') pop();while(No-
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度企業(yè)研發(fā)成果知識(shí)產(chǎn)權(quán)轉(zhuǎn)讓合同范本
- 2025年度醫(yī)療設(shè)備改造與售后服務(wù)協(xié)議
- 2025年度出租車公司車輛租賃合同修訂版
- 2025抖音主播品牌代言合作框架協(xié)議書(shū)
- 2025年C301-I型低壓甲醇合成催化劑合作協(xié)議書(shū)
- 2025年度咖啡廳店鋪轉(zhuǎn)讓合同范本
- 2025年創(chuàng)客中心項(xiàng)目發(fā)展計(jì)劃
- 科研部研究項(xiàng)目進(jìn)展與未來(lái)規(guī)劃計(jì)劃
- 教學(xué)資源的有效整合與利用計(jì)劃
- 度假村行業(yè)保安工作總結(jié)計(jì)劃
- 2024年濰坊護(hù)理職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)附答案
- 《鉗工基本知識(shí)》課件
- 第八期:風(fēng)電典型事故案例剖析(二)
- 2020-2024年五年高考地理真題分類匯編專題02(地球運(yùn)動(dòng))+解析版
- 水文與水資源勘測(cè)基礎(chǔ)知識(shí)單選題100道及答案解析
- 2025年中國(guó)工程建設(shè)行業(yè)現(xiàn)狀、發(fā)展環(huán)境及投資前景分析報(bào)告
- 《海瀾之家公司績(jī)效管理現(xiàn)狀、問(wèn)題及優(yōu)化對(duì)策(7600字論文)》
- DB1509T 0025-2024 肉牛舍設(shè)計(jì)與建筑技術(shù)規(guī)范
- 上海室內(nèi)裝飾施工合同示范文本2024年
- 2024年山東日照初中學(xué)業(yè)水平考試地理卷試題真題(精校打印版)
- 房地產(chǎn) -中建科工五大類型項(xiàng)目成本指標(biāo)庫(kù)
評(píng)論
0/150
提交評(píng)論