語法分析器報告_第1頁
語法分析器報告_第2頁
語法分析器報告_第3頁
語法分析器報告_第4頁
語法分析器報告_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論