版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、武漢理工大學(xué)編譯原理課程設(shè)計說明書IF-ELSE條件語句的翻譯程序設(shè)計1 問題描述 要求用LL(1)自頂向下分析方法及三地址中間代碼,對IF-THEN-ELSE條件語句完成編譯各階段過程,包括詞法、語法、語義等分析。2 問題分析及編譯系統(tǒng)的概要設(shè)計 編譯過程一般分為六個階段的過程,可以由六個模塊完成,它們稱為詞法分析程序、語法分析程序、語義分析程序、中間代碼生成程序、代碼優(yōu)化程序、目標(biāo)代碼生成程序,此外,一個完整編譯程序還必須包括“表格管理程序”和“出錯處理程序”。 這次實(shí)驗(yàn)涉及到詞法分析、語法分析、語義分析及表格管理和出錯管理。其中,詞法分析至少要能識別關(guān)鍵字“if”、“then”和“els
2、e”,標(biāo)識符(即自定義變量),數(shù)字,和運(yùn)算符等等;語法分析要分析程序結(jié)構(gòu)的合法性,即是否為文法的句子;語義分析要能夠語法制導(dǎo)翻譯出中間代碼(三地址)并將其輸出;表格管理是指符號表;出錯處理是指在語法分析時,所有非文法句子的錯誤類型處理.3 文法及屬性文法的定義 3.1 文法:文法是用于描述語言的語法結(jié)構(gòu)的形式規(guī)則(即語法規(guī)則)。這些規(guī)則必須是準(zhǔn)確的、易于理解的以及有相當(dāng)強(qiáng)的描述能力。由這種規(guī)則所產(chǎn)生的程序語言應(yīng)有利于句子分析和翻譯,而且,最好能通過這些規(guī)則自動產(chǎn)生有效的語法分析程序.IF-ELSE條件語句的文法如下所示: 0A->EB 1.B->+EB|-EB| 2.E->F
3、T 3.T->*FT|/FT| 4.F->i|(E) 或者能夠更簡潔一點(diǎn): 0.S->if A THEN B ELSE C 1.A->m rop n 2.B->x=m arop n 3.C->x=n arop m 4.rop->=|<|> 5.arop->+|-|*|/3.2 屬性文法: 屬性文法是在上下文無關(guān)文法的基礎(chǔ)上,為每個文法符號(終結(jié)符或者非終結(jié)符)配備若干相關(guān)的“值”(與文法符號相關(guān)的屬性)。 在一個屬性文法中,對應(yīng)于每個產(chǎn)生式Aa都有一套與之相關(guān)聯(lián)的語義規(guī)則,每規(guī)則的形式為:b:=f(c1,c2,,ck)其中f是一個函數(shù)
4、,而且或者b是A的一個綜合屬性并且c1,c2,,ck是產(chǎn)生式右邊文法符號的屬性或者非終結(jié)符既可有綜合屬性也可有繼屬性,文法開始符號的所有繼承屬性作為屬性計算前的初始值。屬性文法為:if(VTopr='=') /"="判斷;arrd1=arr_iopd;arrd0='='arrd2=id;arrd3=' 'arrd4=' 'id+;else if(VTopr='>') /">"判斷;arrd1=arr_iopd;arrd0='>'arrd2=i
5、d;arrd3=' 'arrd4=' 'id+;else if(VTopr='<') /"<"判斷;arrd1=arr_iopd;arrd0='<'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(VTopr='+') /"+"判斷;arrd1=arr_iopd;arrd0='+'arrd2=id;arrd3=' 'arrd4=' 'id+;else
6、if(VTopr='-') /"-"判斷;arrd1=arr_iopd;arrd0='-'arrd2=id;arrd3=' 'arrd4=' 'id+; else if(VTopr='*') /"*"判斷;arrd1=arr_iopd;arrd0='*'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(VTopr='/') /"/"判斷;arrd1=arr_iopd
7、;arrd0='/'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(opr=-2) /其他字符判斷;arrd1=id-1; arrd0=' 'arrd2=arr_iopd;arrd3=' 'arrd4=' 'else if(VTopr!='<'&&VTopr!='>'&&VTopr!='+'&&VTopr!='-'&&VTopr!=
8、'*'&&VTopr!='/')/"#"結(jié)束符判斷; arrd1=id-1;d+;4 詞法分析 首先應(yīng)該創(chuàng)建一個枚舉類型的變量來存放一些關(guān)鍵字: char VN11='K','L','P','S','E','G','T','R','F','Q','0' /產(chǎn)名生式頭 char VT16='i','=','<&
9、#39;,'>','+','-','*','/','(',')','f','t','e','','0' /特征字符集 再創(chuàng)建一個結(jié)構(gòu)體,用來存放詞法分析的結(jié)果,共有兩個域,一個關(guān)鍵字域,表明他是什么類型,以及它自身的內(nèi)容。 這個詞法分析程序比較簡單,因?yàn)楸旧淼某绦蚓途窒拊趇f-else語句,所以保留字的類型我就只寫了if、then和else三個;碰到數(shù)字開頭的除了關(guān)鍵字就是標(biāo)識符;碰到數(shù)字開頭的就是
10、數(shù)字;碰到界限符和操作符(因?yàn)橐氲念愋鸵埠苌伲?,所以也很容易區(qū)別。 在詞法分析結(jié)束之后,就應(yīng)該把分析的結(jié)果輸出來。輸出的格式是【(單詞,類型編號) 類型名】 源程序文件字符的分離 單詞的判斷查找相應(yīng)的表單詞的類型的判斷調(diào)用不同類型的單詞處理函數(shù)進(jìn)行單詞的處理產(chǎn)生類型碼將中間單詞和其類型碼存入數(shù)組處理完畢 詞法分析程序如下: void lexical() /"ifm>n theni=i+9 elseb=b/3#"是其一條特殊的例子 int i,j,d; char ch; j=d=0; for(i=0;vari!='#'i+) ch=vari; if(c
11、h='i'&&vari+1='f') cout<<"if"<<'t'<<"keyword"<<'t'<<'t'<<"關(guān)鍵字"<<endl; queuej+='f'i+=1; /判斷"if"關(guān)鍵字 else if(ch='t') ch=vari+1; if(ch='h') ch=vari+2;
12、 if(ch='e') ch=vari+3; if(ch='n') ch=vari+4;cout<<"then"<<'t'<<"keyword"<<'t'<<'t'<<"關(guān)鍵字"<<endl;queuej+='t'i+=3;/判斷"then"關(guān)鍵字else if(ch='e')ch=vari+5;if(ch='l&
13、#39;)ch=vari+6;if(ch='s')ch=vari+7;if(ch='e')ch=vari+8;cout<<"else"<<'t'<<"keyword"<<'t'<<'t'<<"關(guān)鍵字"<<endl;queuej+='e'i+=3;/判斷"else"關(guān)鍵字else if(index(ch,VT)<=0)if(ch!=&
14、#39;'&&ch!=''&&ch!='('&&ch!=')')cout<<ch<<'t'<<"variable:i"<<d+<<""<<'t'<<"標(biāo)示符"<<endl;arr_id-1=ch;queuej+='i'else cout<<ch<<'t'
15、;<<"bound"<<'t'<<'t'<<"括 號"<<endl;else if(index(ch,VT)>0)cout<<ch<<'t'<<"operator"<<'t'<<"運(yùn)算符"<<endl;queuej+=ch; queuej='#'/"#"就直接跳出 for(i=0;
16、queuei!='#'i+)cout<<queuei; cout<<endl; 5 語法分析 主要的思想是設(shè)置一個分析棧和一個輸入串隊(duì)列,棧中最開始時存放的是文法開始符和“#”。因?yàn)槲疫@個程序本身已經(jīng)確定是以if語句開頭,所以,就不再把if放在輸入串中,而只是分析if以后的句子。在語法分析之前應(yīng)該判定該文法是不是一個LL(1)文法。判別的主要方法是做出文法中所有產(chǎn)生式的select集,對于同一個非終結(jié)符的不同產(chǎn)生式,如果他們的select集合沒有交集,則說明這個文法是LL(1)文法。這個文法的預(yù)測分析表也設(shè)計的比較簡單,如下表所示: -1, -1, -1
17、, -1, -1, -1, -1, -1, -1, -1, 0, -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, 3, 2, -1,4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,5, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1, -1, -1,-1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1,
18、8, 8, 8,9, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1,-1, -1, -1, -1 , 12, 12, 10, 11, -1, -1, -1, 12, 12, 12,14, -1, -1, -1, -1, -1,- 1, -1, 13, -1, -1, -1, -1, -1,-1, 15, 16, 17, -1, -1, -1, -1, -1, -1, -1,- 1,- 1, -1, /預(yù)測分析表注:除了-1代表此處有產(chǎn)生式與之對應(yīng),具體的產(chǎn)生式在程序中給出。-1代表此處無產(chǎn)生式與之對應(yīng)。void syntax()int n;
19、count+;print();X=stacksp;a=queuefront;if(X='#'&&a='#')f=4;if(X<'A'|X>'Z') /判斷字符集不是大寫字母集合if(X=a)sp-;front+;if(a!='i') /"i"是特征字母if(a!='f'&&a!='t'&&a!='e'&&a!=''&&a!='#
20、9;)opr=index(a,VT);semantic();else if(a=''|a='e'|a='t'|a='#') opr=-2;semantic();cout<<'t'<<'''<<a<<"'匹配"<<endl;elseopd=c;/cout<<opd1<<" "<<opd2;cout<<'t'<<&
21、#39;''<<arr_ic+<<"'匹配"<<endl;else f=1; /字符不匹配,轉(zhuǎn)去出錯處理elseint tx=index(X,VN);/索引選擇int ta=index(a,VT);/索引選擇n=Mtxta; /產(chǎn)生式選擇tdt+=Mtxta; /產(chǎn)生式選擇if(ta=-1)f=2;cout<<a<<endl; /字符沒有出現(xiàn)在產(chǎn)生式終結(jié)符集VT中,轉(zhuǎn)去出錯處理else if(n=-1)f=3; /沒有找到合適的候選產(chǎn)生式來做進(jìn)一步推導(dǎo),轉(zhuǎn)去出錯處理else /用產(chǎn)生式Mtx
22、ta來做進(jìn)一步推導(dǎo)sp-;cout<<'t'<<X<<"->"if(len(pn)!=0)for(int i=len(pn)-1;i>=0;i-)stack+sp=pni;cout<<pnlen(pn)-1-i;cout<<endl;else cout<<"空串"<<endl; if(f=0)syntax();else tdt='-1'err(f);因?yàn)樵谕茖?dǎo)過程中,會一并完成產(chǎn)生式后面附加的語義動作,所以這兩部分是一起做的。另
23、外,在LL(1)分析過程中,會出現(xiàn)錯誤信息,如字符不匹配,或字符沒有出現(xiàn)在產(chǎn)生式終結(jié)符集VT中,或沒有找到合適的候選產(chǎn)生式來做進(jìn)一步推導(dǎo),會調(diào)用相應(yīng)的出錯處理函數(shù)err(f)。另外,此函數(shù)是遞歸實(shí)現(xiàn),結(jié)束標(biāo)志是f!=0,即成功或失敗。6 出錯處理由于輸入的表達(dá)式有錯誤就要產(chǎn)生相應(yīng)的出錯處理函數(shù)void err(int n)if(n=1)cout<<"字符不匹配"<<endl;else if(n=2)cout<<"字符沒有出現(xiàn)在產(chǎn)生式終結(jié)符集VT中"<<endl;else if(n=3)cout<<
24、;"沒有找到合適的候選產(chǎn)生式來做進(jìn)一步推導(dǎo)"<<endl;else cout<<"該句子是文法語言的句子!"<<endl;7 語義分析及中間代碼輸出 根據(jù)上面給出的屬性文法所規(guī)定的翻譯方案,即可對輸入的程序進(jìn)行相應(yīng)的語義分析。對于中間代碼部分,老師給的題目是以三地址的形式輸出。對于三地址形式,在學(xué)習(xí)編譯原理的時候接觸的不是很多。我們接觸的多的一般都是逆波蘭式和四元式。仔細(xì)看書才發(fā)現(xiàn),三地址和四元式是很相近的。比如說計算一個表達(dá)式a+b-c,四元式的形式是(+,a,b,t1),(-,t1,c,t2)。而三地址的形式為t1
25、:=a+b,t2=t1-c。而對于跳轉(zhuǎn)語句,無條件跳轉(zhuǎn)如jump L1的四元式形式為(jump,-,-,L1);而其對應(yīng)的三地址形式為goto L1。而對于條件跳轉(zhuǎn)語句,則四元式為(jrop,a,b,L1),而三地址形式為if a rop b goto L1。產(chǎn)生跳轉(zhuǎn)的主要有三個地方,第一,就是if條件成立,則跳轉(zhuǎn)到then后面的語局;第二,執(zhí)行完then后面的語句后跳轉(zhuǎn)到程序的出口;第三,就是if條件不成立則跳轉(zhuǎn)到else后面的語句。在判斷完if后面的條件后,保存這個布爾值,并產(chǎn)生跳轉(zhuǎn)地址,這時,應(yīng)該繼續(xù)向前讀取,如果碰到then這個關(guān)鍵字,則回填地址到then前面,否則報錯。 關(guān)鍵是回填地
26、址的那個函數(shù)一定要寫準(zhǔn)確。在有跳轉(zhuǎn)的語句后面,一定要有跳轉(zhuǎn)的地址,即要跳到什么地方。產(chǎn)生跳轉(zhuǎn)的語句有在token這個結(jié)構(gòu)體中有個地址域,用來保存轉(zhuǎn)向的地址。而在產(chǎn)生運(yùn)算結(jié)果的語句中,token這個結(jié)構(gòu)體中有個result域,用來保存這個結(jié)果。 /打印詞法分析結(jié)果void print()cout<<"("if(count<10)cout<<'0'cout<<count<<")"int i;for(i=0;i<=sp;i+)cout<<stacki;for(;i<=
27、20;i+)cout<<" "for(i=0;i<front;i+)cout<<" "for(;queuei!='#'i+)cout<<queuei;cout<<queuei;for(;i<=20;i+)cout<<" "/語義分析程序void semantic()if(VTopr='=') /"="判斷;arrd1=arr_iopd;arrd0='='arrd2=id;arrd3=' &
28、#39;arrd4=' 'id+;else if(VTopr='>') /">"判斷;arrd1=arr_iopd;arrd0='>'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(VTopr='<') /"<"判斷;arrd1=arr_iopd;arrd0='<'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(VTo
29、pr='+') /"+"判斷;arrd1=arr_iopd;arrd0='+'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(VTopr='-') /"-"判斷;arrd1=arr_iopd;arrd0='-'arrd2=id;arrd3=' 'arrd4=' 'id+; else if(VTopr='*') /"*"判斷;arrd1=arr_iopd;arrd0
30、='*'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(VTopr='/') /"/"判斷;arrd1=arr_iopd;arrd0='/'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(opr=-2) /其他字符判斷;arrd1=id-1; arrd0=' 'arrd2=arr_iopd;arrd3=' 'arrd4=' 'else if(VTopr!=&
31、#39;<'&&VTopr!='>'&&VTopr!='+'&&VTopr!='-'&&VTopr!='*'&&VTopr!='/')/"#"結(jié)束符判斷; arrd1=id-1;d+;/輸出三地址cout<<"輸出三地址:"<<endl;for(i=0;i<d;i+)for(int j=0;j<5;j+)if(arrij>=0&
32、&arrij<=9)cout<<"("<<char(arrij+'0')<<")"<<" "else cout<<arrij<<" "cout<<endl; 而三元式的輸出則很簡單。但也要根據(jù)它具體的語義來進(jìn)行輸出。如果是if語句,則要根據(jù)if后面的bool語句來實(shí)現(xiàn)跳轉(zhuǎn)。如果為真,應(yīng)該調(diào)到then后面的語句,如果為假,則跳轉(zhuǎn)到else后面的語句,每個語句都有自己的標(biāo)號,用label來標(biāo)識。而對于每個計
33、算結(jié)果的表達(dá)式,則首先用一個中間變量來存放結(jié)果,每次按照運(yùn)算符的優(yōu)先級算出一個結(jié)果,保存在中間變量中,最后將中間變量的結(jié)果賦給語句中的變量。 8 軟件測試方法和結(jié)果 輸入一組正確的詞法和語法的if-else語句,和一組有詞法錯誤和語法錯誤的if語句。 1. if m>n then i=i+3else b=b/2 測試結(jié)果如下: 2. if1 m>n then i=i*3else b=b-1測試的結(jié)果如下所示:9 分析本次設(shè)計 這次設(shè)計大體上還是自己動腦筋去想了,去做了。所以覺得并不是那么的難。關(guān)鍵的步驟就是三個,設(shè)計詞法分析程序,語法分析程序,及語義分析程序和中間代碼的輸出程序。詞
34、法分析程序由于上次實(shí)驗(yàn)做過了,所以這次做起來還是比較的順手,只是這次的單詞設(shè)計的比較簡單,如關(guān)鍵字就只有三個,if、else和then;用戶自定義變量的標(biāo)識符也沒有考慮以下劃線開頭的部分。 我做的語法分析方法是ll(1)的分析方法,這個方法的關(guān)鍵首先要構(gòu)造一個if else語句的文法,然后將其轉(zhuǎn)換為ll(1)文法,再根據(jù)每個產(chǎn)生式的select集構(gòu)造預(yù)測分析表。然后就是相應(yīng)的分析。構(gòu)造一個分析棧和一個輸入串隊(duì)列,棧的初始內(nèi)容是文法的開始符號和“#”,輸入串隊(duì)列則是輸入串的內(nèi)容。然后根據(jù)預(yù)測分析表做出相應(yīng)的推導(dǎo)和匹配動作,最后如果棧里的內(nèi)容和隊(duì)列里的內(nèi)容都是以“#”號的形式匹配的話,這個語句就分
35、析成功。我這次主要只是考慮了表達(dá)式的分析過程,而沒有把if else then這些關(guān)鍵字的分析過程加入進(jìn)來。因?yàn)槲覀冞@次設(shè)計也是針對一個特定的語句(如我的if else語句)來進(jìn)行分析的,所以我就假設(shè)所有的輸入串當(dāng)中都在相應(yīng)的位置有那些關(guān)鍵字了。所以程序做起來就比較簡單,容易實(shí)現(xiàn)。 而語義分析則是要識別這句話要做什么,并且將其要做的事情用三地址的形式翻譯出來。這個對我來說的確有點(diǎn)困難,所以見參考了一下其他同學(xué)的設(shè)計方法。這個也是這次設(shè)計的不足之處,望老師見諒-。10 參考文獻(xiàn)1 張素琴、呂映芝、蔣維杜、戴桂蘭等編譯原理(第2版)清華大學(xué)出版社2005年2月參考書:2 程序設(shè)計語言編譯原理 國防
36、工業(yè)出版社 陳火旺著3 編譯原理習(xí)題與解析 清華大學(xué)出版社出版社 伍春香著 11 源程序清單#include<iostream.h>#define MAX 100 char X,a;char VN11='K','L','P','S','E','G','T','R','F','Q','0' /產(chǎn)名生式頭char VT16='i','=','<','&
37、gt;','+','-','*','/','(',')','f','t','e','','0' /特征字符集char p188="fLtLeS0","SP0","0","0","iQE0","TG0","+TG0","-TG0","0"
38、,"FR0","*FR0","/FR0","0","(E)0","i0","=0","<0",">0"/產(chǎn)生式集合數(shù)組char stackMAX;char queueMAX;int sp,front;int M1014= -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-
39、1,-1,-1,-1,-1,-1,-1,-1, 3, 2,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1, 8, 8, 8,9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12,14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,15,16,17,-1,-1,-1,-1
40、,-1,-1,-1,-1,-1,-1,; /預(yù)測分析表int f=0;int count=0;int c=0;char arr_iMAX; /字符管理char varMAX; /表格管理int tdMAX; /輸出產(chǎn)生式序列int t=0;int opd=-1;int opr=-1;int id=0;/int ptrMAX;int d=0;char arrMAX5; /存放待輸出的三地址/char keyword211="if0","then0","else0"int len(char str)int i=0;while(stri!=
41、'0')i+;return i;int index(char ch,char str)int i=0;while(stri!='0')if(ch!=stri)i+;else break;if(stri='0')return -1;return i;/出錯管理選項(xiàng)void err(int n)if(n=1)cout<<"字符不匹配"<<endl;else if(n=2)cout<<"字符沒有出現(xiàn)在產(chǎn)生式終結(jié)符集VT中"<<endl;else if(n=3)cou
42、t<<"沒有找到合適的候選產(chǎn)生式來做進(jìn)一步推導(dǎo)"<<endl;else cout<<"該句子是文法語言的句子!"<<endl;/打印此法分析結(jié)果void print()cout<<"("if(count<10)cout<<'0'cout<<count<<")"int i;for(i=0;i<=sp;i+)cout<<stacki;for(;i<=20;i+)cout<&
43、lt;" "for(i=0;i<front;i+)cout<<" "for(;queuei!='#'i+)cout<<queuei;cout<<queuei;for(;i<=20;i+)cout<<" "/語義分析程序void semantic()if(VTopr='=') /"="判斷;arrd1=arr_iopd;arrd0='='arrd2=id;arrd3=' 'arrd4='
44、 'id+;else if(VTopr='>') /">"判斷;arrd1=arr_iopd;arrd0='>'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(VTopr='<') /"<"判斷;arrd1=arr_iopd;arrd0='<'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(VTopr='+')
45、 /"+"判斷;arrd1=arr_iopd;arrd0='+'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(VTopr='-') /"-"判斷;arrd1=arr_iopd;arrd0='-'arrd2=id;arrd3=' 'arrd4=' 'id+; else if(VTopr='*') /"*"判斷;arrd1=arr_iopd;arrd0='*'arr
46、d2=id;arrd3=' 'arrd4=' 'id+;else if(VTopr='/') /"/"判斷;arrd1=arr_iopd;arrd0='/'arrd2=id;arrd3=' 'arrd4=' 'id+;else if(opr=-2) /其他字符判斷;arrd1=id-1; arrd0=' 'arrd2=arr_iopd;arrd3=' 'arrd4=' 'else if(VTopr!='<'&a
47、mp;&VTopr!='>'&&VTopr!='+'&&VTopr!='-'&&VTopr!='*'&&VTopr!='/')/"#"結(jié)束符判斷; arrd1=id-1;d+;/語法分析程序void syntax()int n;count+;print();X=stacksp;a=queuefront;if(X='#'&&a='#')f=4;if(X<'A&
48、#39;|X>'Z') /判斷字符集不是大寫字母集合if(X=a)sp-;front+;if(a!='i') /"i"是特征字母if(a!='f'&&a!='t'&&a!='e'&&a!=''&&a!='#')opr=index(a,VT);semantic();else if(a=''|a='e'|a='t'|a='#') opr
49、=-2;semantic();cout<<'t'<<'''<<a<<"'匹配"<<endl;elseopd=c;/cout<<opd1<<" "<<opd2;cout<<'t'<<'''<<arr_ic+<<"'匹配"<<endl;else f=1; /字符不匹配,轉(zhuǎn)去出錯處理elsei
50、nt tx=index(X,VN);/索引選擇int ta=index(a,VT);/索引選擇n=Mtxta; /產(chǎn)生式選擇tdt+=Mtxta; /產(chǎn)生式選擇if(ta=-1)f=2;cout<<a<<endl; /字符沒有出現(xiàn)在產(chǎn)生式終結(jié)符集VT中,轉(zhuǎn)去出錯處理else if(n=-1)f=3; /沒有找到合適的候選產(chǎn)生式來做進(jìn)一步推導(dǎo),轉(zhuǎn)去出錯處理else /用產(chǎn)生式Mtxta來做進(jìn)一步推導(dǎo)sp-;cout<<'t'<<X<<"->"if(len(pn)!=0)for(int i=len
51、(pn)-1;i>=0;i-)stack+sp=pni;cout<<pnlen(pn)-1-i;cout<<endl;else cout<<"空串"<<endl; if(f=0)syntax();else tdt='-1'err(f);/測法分析程序void lexical() /"ifm>n theni=i+9 elseb=b/3#"是其一條特殊的例子int i,j,d;char ch;j=d=0;for(i=0;vari!='#'i+)ch=vari;if(c
52、h='i'&&vari+1='f')cout<<"if"<<'t'<<"keyword"<<'t'<<'t'<<"關(guān)鍵字"<<endl; queuej+='f'i+=1;/判斷"if"關(guān)鍵字else if(ch='t')ch=vari+1;if(ch='h')ch=vari+2;if(ch=
53、'e')ch=vari+3;if(ch='n')ch=vari+4;cout<<"then"<<'t'<<"keyword"<<'t'<<'t'<<"關(guān)鍵字"<<endl;queuej+='t'i+=3;/判斷"then"關(guān)鍵字else if(ch='e')ch=vari+5;if(ch='l')ch=va
54、ri+6;if(ch='s')ch=vari+7;if(ch='e')ch=vari+8;cout<<"else"<<'t'<<"keyword"<<'t'<<'t'<<"關(guān)鍵字"<<endl;queuej+='e'i+=3;/判斷"else"關(guān)鍵字else if(index(ch,VT)<=0)if(ch!=''&&ch!=''&&ch!='('&&ch!=')')cout<<ch<<'t'<<"variable:i"<<d+<<""<<'
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建師范大學(xué)《學(xué)校德育理論與實(shí)踐》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024年二建機(jī)電預(yù)測A卷講義(可打印版)
- 枸杞種植公司虧損原因分析報告模板
- 福建師范大學(xué)《山水畫基礎(chǔ)二》2022-2023學(xué)年第一學(xué)期期末試卷
- 浙江省杭州市2018年中考英語真題(含答案)
- 光伏項(xiàng)目承諾書
- 操作系統(tǒng) 課件 第5、6章 存儲管理、文件系統(tǒng)
- 2024年黔東南客運(yùn)資格證題庫
- 2024年西寧客車從業(yè)資格證考試試題答案
- 2024年蘇州客運(yùn)從業(yè)資格證考試模板
- 維修確認(rèn)單(共4頁)
- 高血壓健康教育知識講座(完整版)
- 河北中小學(xué)學(xué)籍管理
- 四年級數(shù)學(xué)上冊脫式計算100題
- 村鎮(zhèn)銀行防詐騙應(yīng)急預(yù)案及處置流程
- 細(xì)胞標(biāo)準(zhǔn)化纖體資料終打印稿
- DB1310∕T 233-2020 地下管線數(shù)據(jù)規(guī)范
- 特種設(shè)備檢驗(yàn)檢測人員執(zhí)業(yè)注冊管理辦法標(biāo)準(zhǔn)版
- 數(shù)字文化產(chǎn)業(yè)園項(xiàng)目可行性研究報告-完整可修改版
- 少先隊(duì)鼓號隊(duì)總譜0—10套
- 航空公司投訴抱怨處理技巧訓(xùn)練 空乘人員培訓(xùn)
評論
0/150
提交評論