版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、編譯原理實驗報告實驗題目:詞法分析器構(gòu)造指導(dǎo)教師:楊建,趙會群姓名: 班級:學(xué)號:實驗成績:實驗題目語法分析器構(gòu)造實驗?zāi)康暮鸵蠼柚谠~法分析程序提供的分析結(jié)果,編寫一個算符優(yōu)先語法分析程序,程序能進行語法結(jié)構(gòu)分析和錯誤檢查并產(chǎn)生相應(yīng)的歸約信息。同時給出出錯信息和錯誤類型,從而加深對語法分析的理解。設(shè)計思想與框架1.本實驗的優(yōu)先表可以手工先設(shè)計好:算符優(yōu)先關(guān)系表- + - * / ( ) i #+ > > < < < > < >- > > < < < > < >* > > > &g
2、t; < > < >/ > > > > < > < >( < < < < < = < ?) > > > > ? > ? >i > > > > ? > ? ># < < < < < ? < =-算術(shù)表達式->項|算術(shù)表達式+項|算術(shù)表達式-項項->因子|項*因子|項/因子因子->變量|常數(shù)|(算術(shù)表達式)2.本實驗要求中提出的“產(chǎn)出相應(yīng)的歸約信息”意指在語法分析的過
3、程中,一旦產(chǎn)生歸約,在程序上產(chǎn)生并最終輸出歸約產(chǎn)生式序號。3.出錯類型的產(chǎn)生可預(yù)先對應(yīng)優(yōu)先表中出錯欄列表說明其出錯類型,并分別編序,當(dāng)分析中產(chǎn)生錯誤時以字符串輸出相應(yīng)表中錯誤信息。核心算法算法采用一個符號棧的數(shù)據(jù)結(jié)構(gòu),既用它存放終結(jié)符,也用它存放非終結(jié)符。設(shè)K為符號棧使用深度,其參考算法如下: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歸約為某個N記錄歸約產(chǎn)生
4、式序號K:=j+1SK:=NEnd of while If Sj<a OR Sj=a thenBeginK:=K+1; SK:=aEnd Else ERROR 查表打印出錯信息Until a='#'輸出歸約產(chǎn)生式序列號;源程序及注釋#include <iostream>#include <cstdio>#include <iomanip>using namespace std;#define N 100#define NULL 0FILE *fp;/預(yù)處理文件指針/定義符號棧的大小與輸入字符串的大小以及算術(shù)表達式字符串的大小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表示錯誤)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<<"移進"<<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錯誤e2:缺少運算符!");else if(ch_di(stackt)=5)printf("n錯誤e1:非法左括號!");else printf("n錯誤e3:非法右括號!");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)先語法分析程序*"<<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ù)表達式.T表示項.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<<"請先將實驗文件夾中的預(yù)處理.txt文件復(fù)制到實驗文件夾中!"<<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)先語法分析結(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ù)表達式"<<id<<"為: "<<oldstrings<<endl; cout<<"轉(zhuǎn)換為輸入串: "<<strings<<endl; cout<<" 步驟號符號棧優(yōu)先關(guān)系當(dāng)前分析符剩余輸入串動作" prior_analysis(); n=0; cout<<endl; cout<<"算術(shù)表達式"<<id+<<"的"<<"歸約產(chǎn)生式步驟號為:" while(Non) cout<<" "<<Non; n+;cout<<endl; while(stack0!='0') pop();while(No-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第45屆世界技能大賽全國選拔賽汽車噴漆項目技術(shù)工作文件
- 科目一科目四理論考試記憶口訣-駕考實操
- 掌握2024年視覺盛宴:AE基礎(chǔ)培訓(xùn)教程從入門到精通
- 從理論到實踐:2024年3dmax詳盡教案
- 三角形分類教案創(chuàng)新:2024年的教學(xué)挑戰(zhàn)
- 冰箱冰柜作業(yè)指導(dǎo)書
- 2024年全球教育:《黃河落日》課件的國際化視野
- 2024-2025學(xué)年八年級物理上冊3.3噪聲同步課堂含解析新版教科版
- 部編版七年級下冊道德與法治第四課揭開情緒的面紗訓(xùn)練題
- 2025屆高考生物一輪復(fù)習(xí)第2單元細胞的基本結(jié)構(gòu)與物質(zhì)交換第2講細胞膜與細胞核學(xué)案新人教版必修1
- 大學(xué)生辯論賽評分標準表
- 診所污水污物糞便處理方案及周邊環(huán)境
- 江蘇開放大學(xué)2023年秋《馬克思主義基本原理 060111》形成性考核作業(yè)2-實踐性環(huán)節(jié)(占過程性考核成績的30%)參考答案
- 《我是班級的主人翁》的主題班會
- 酒店安全設(shè)施及安全制度
- 近代化的早期探索與民族危機的加劇 單元作業(yè)設(shè)計
- 租賃機械設(shè)備施工方案
- 屋面融雪系統(tǒng)施工方案
- 二年級家長會語文老師課件
- 結(jié)構(gòu)加固改造之整體結(jié)構(gòu)加固教學(xué)課件
- 教堂安全風(fēng)險分級管控體系方案全套資料(2019-2020新標準完整版)
評論
0/150
提交評論