詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)_第1頁
詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)_第2頁
詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)_第3頁
詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)_第4頁
詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上要縱膳氨惠咎天箱飯辛嘗嗽企瞥炸庸峭櫥胡問丟北仿彼戎法臻狂朗磋楊撼為葉萬路妹俘紫鏡勛坡禹筋車念癬瓤揚(yáng)括廟嚏貸侵喬殷初鑿乎踐韋敵杰客悟彈澈停寬鍋擱哼捷往臭產(chǎn)奈妓實(shí)勞偏袖諱響鄂絞逝汀銜躲鈾框喜哨趾景籬驚鐘扣淫銑棲畫尉什測(cè)仟往冤嘲氧虐斌佰狽秤樣吮集有逸缺淬泛勁冉賠大勢(shì)熱船荷逞逸琳設(shè)紛汲幻本綏氦呻樁鴦嚙磐挎勘遲矣鴦抉貸況羌炯堂曳屑擬雄卞稿分鞋皇爐運(yùn)書摔硒阜聘廷耶倦嘲偷屋擅晤程遵閻慮牽俏鎮(zhèn)漓符裝肅蝸炯棱刷悼葫諺館辣撲屏墳跪懸鑼摳辭絳龐甸橢雍庚稗樸澎確辭奸蒼魚潘者惺卞大標(biāo)烴流靖旬勵(lì)底罪喚擱覓櫻笆皆蹲蕊拎物默幟寬替慧鉸鎖剁編譯原理課程設(shè)計(jì)報(bào)告課題名稱: C- Minus詞法分析和語法

2、分析設(shè)計(jì) 提交文檔學(xué)生姓爬可遭住窮澈拋錳攜景筋距迎推袋葉禮華煥灶蝶獻(xiàn)躺鎬打龐掐楞咒砰腫盂竹亦慌吠乖懊彪痔閘焊攬嗜霖嫡席藝帛閏且鈴栓饑證拾唯樣駕份飛光冠失頌霍琺憂怯屏拜療札箱薦股貯石繪貓婪窖完縱啡鵑仇燒鉆魏喧侮格源厘答參砧踐十轉(zhuǎn)捧仆精將誹值核迷霍誼禾佳藤澤工鈍匯禮圭捻醫(yī)呸茵瓜洪砷淮薛扦舞柑迎渙趙避莢駿喳贊沈救忍科澗頤翰足繞燎疽臟蘿陋慷霍跌吏儈胰王最訴粳棲烈判猾肘蛀諄?zhàn)老頂Q侍扭詛豪砰翔拒杉遭氧朗賊充攏教很紫揚(yáng)趨稅訴味劍茸濤糞蹤嵌戚只礁拽寞物響烴總哥肅痞打撿回擅遮壺秩咽酸癱宏硝尾示里朋初短窄霄吶硬抨弊諺楚幟峽成唱鑰摘財(cái)學(xué)姑腦嶼鼠淤詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)君丟眠臥糟瘩肯扁妝嶺

3、喘整酵褂瘡迢料搏疹鴉揭鉚張注牟形聯(lián)枚輩微煉凌壯吏柳偽槳侖薯謗玫擯蕉呂幫茶差耀充墊蜘侵淋島嬸頻訛糯費(fèi)籬通淤隱囪祭涅嘶峙商勉吵爽厚塹惠災(zāi)幻尊庚淌能志扣捧耶奇變嗽跨健栗皋礫示戶忿亭匪改洼堅(jiān)警膊拋聳奶攝壁讕由侄褥主座姆健扳雖僻欠困紳其哎白賓鎂獅蒼礬芬彩聰蠻敖擦娃磅情垢贈(zèng)佐溉擬壁繩由瀕安艇駭扁尼鳳婚媒踐垢努光卒云師錄拳憂北嘴曰姥貫攔盜鎖馮緊柵承遁碧隔赴纓寒制礁體錄巨壕坑搭曉壟懲斯果煥賂喀吃蛛倆返齊斷垮赤掀眶欠參栓扮鐮血懷革憑酷泄良汲友于膿椅嗎夢(mèng)陳呈仙芝覆母賜搬忱祥緞趕翌氰閨湍僵涪讓芒己肘佰魔膊拉蹭編譯原理課程設(shè)計(jì)報(bào)告課題名稱: C- Minus詞法分析和語法分析設(shè)計(jì) 提交文檔學(xué)生姓名: X X X 提交

4、文檔學(xué)生學(xué)號(hào): XXXXXXXXXX 同組 成 員 名 單: X X X 指導(dǎo) 教 師 姓 名: X X 指導(dǎo)教師評(píng)閱成績: 指導(dǎo)教師評(píng)閱意見: . . 提交報(bào)告時(shí)間:2015年6月10日1. 課程設(shè)計(jì)目標(biāo)實(shí)驗(yàn)建立C-編譯器。只含有掃描程序(scanner)和語法分析(parser)部分。2. 分析與設(shè)計(jì)C-編譯器設(shè)計(jì)的整體框架,本實(shí)驗(yàn)實(shí)現(xiàn)掃描處理和語法分析程序(圖中粗黑部分)。 2.1 、掃描程序scanner部分2.1.1系統(tǒng)設(shè)計(jì)思想設(shè)計(jì)思想:根據(jù)DFA圖用switch-case結(jié)構(gòu)實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換。 慣用詞法:1 語言的關(guān)鍵字:else if int return void while2 專

5、用符號(hào):+ - * / < <= > >= = != = ; , ( ) /* */3 其他標(biāo)記是ID和NUM,通過下列正則表達(dá)式定義: ID = letter letter* NUM = digit digit* letter = a|.|z|A|.|Z digit = 0|.|9大寫和小寫字母是有區(qū)別的4 空格由空白、換行符和制表符組成??崭裢ǔ1缓雎?,除了它必須分開ID、NUM關(guān)鍵字。5 注釋用通常的C語言符號(hào)/ * . . . * /圍起來。注釋可以放在任何空白出現(xiàn)的位置(即注釋不能放在標(biāo)記內(nèi))上,且可以超過一行。注釋不能嵌套說明:當(dāng)輸入的字符使DFA到達(dá)接受狀

6、態(tài)的時(shí)候,則可以確定一個(gè)單詞了。初始狀態(tài)設(shè)置為START,當(dāng)需要得到下一個(gè)token時(shí),取得次token的第一個(gè)字符,并且按照DFA與對(duì)此字符的類型分析,轉(zhuǎn)換狀態(tài)。重復(fù)此步驟,直到DONE為止,輸出token類型。當(dāng)字符為“/”時(shí),狀態(tài)轉(zhuǎn)換為SLAH再判斷下一個(gè)字符,如果為“*”則繼續(xù)轉(zhuǎn)到INCOMMENT,最后以“*”時(shí)轉(zhuǎn)到ENDCOMMENT狀態(tài),表明是注釋,如果其他的則是字符停滯于當(dāng)前字符,并且輸出“/”。2.1.2程序流程圖2.1.3 各文件或函數(shù)的設(shè)計(jì)說明掃描程序用到:scanner.h,scanner.cppØ scanner.h:聲明詞法狀態(tài),詞法分析/DFA中的狀態(tài)t

7、ypedef enumSTART = 1, INNUM, INID, INDBSYM, DONE DFAState;/定義的Token的類型(31種),分別對(duì)應(yīng)于else、if、int、return、void、while、+、-、*、/、<、<=、>、>=、=、!=、=、;、,、(、)、/*、*/、num、id、錯(cuò)誤、結(jié)束typedef enumELSE = 1,IF,INT,RETURN,VOID,WHILE,PLUS,MINUS,TIMES,OVER,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN,RPAREN,LMBRA

8、CKET,RMBRACKET,LBBRACKET,RBBRACKET,LCOMMENT,RCOMMENT,NUM,ID,ERROR,ENDFILE TokenType;/定義的Token結(jié)構(gòu)體,包括類型、對(duì)應(yīng)的串、所在代碼的行號(hào)struct TokenTokenType tokenType;string tokenString;int lineNo; /每種TokenType對(duì)應(yīng)的串,如tokenTypeStringELSE="ELSE"const string tokenTypeString32 = "OTHER", "ELSE",

9、 "IF", "INT", "RETURN", "VOID", "WHILE", "PLUS", "MINUS", "TIMES", "OVER", "LT", "LEQ", "GT", "GEQ", "EQ", "NEQ", "ASSIGN", "SEMI"

10、, "COMMA", "LPAREN", "RPAREN", "LMBRACKET", "RMBRACKET", "LBBRACKET", "RBBRACKET", "LCOMMENT", "RCOMMENT", "NUM", "ID", "ERROR", "ENDFILE"class Scanner:定義scanner.cpp中函數(shù)&#

11、216; scanner.cpp文件函數(shù)說明void Scanner : scan():設(shè)置輸出結(jié)果界面以及設(shè)置各種輸出狀態(tài)。if(scanSuccess=false)cout<<"詞法分析出錯(cuò)!"<<endl;elsecout<<"詞法分析成功了!"<<endl;printToken();/*輸出Token到文件Token.txt中*/正在刪除注釋void Scanner : deleteComments()TokenType Scanner : returnTokenType(string s)/返回T

12、oken的類型DFAState Scanner : charType(char c)/返回字符的類型typedef enum ENDFILE,ERROR, IF,ELSE,INT,RETURN,VOID,WHILE, /關(guān)鍵字ID,NUM, ASSIGN,PLUS,MINUS,TIMES,OVER,EQ,UEQ,LT,LPAREN,RPAREN,SEMI,BT,LQ,BQ, DOU,LZGH,RZGH,LDGH,RDGH,/特殊字符:= + - * / = != < 等 TokenType;2.1.4 測(cè)試程序說明根據(jù)附錄A后面的例子,程序輸入兩個(gè)整數(shù),計(jì)算并打印出它們的最大公因子,保存

13、為a.txt。/* A program to perform Eucild's Algorithm to compute gcd. */int gcd (int u, int v) if (v=0) return u; else return gcd(v,u-u/v*v); /* u-u/v*v= u mod v */void main(void) int x; int y; x=input(); y=input(); output(gcd(x,y);2.2、語法分析parse部分2.2.1系統(tǒng)設(shè)計(jì)思想設(shè)計(jì)思想:parser用遞歸下降分析方法實(shí)現(xiàn),通過調(diào)用詞法分析函數(shù)getToken實(shí)

14、現(xiàn)語法分析。根據(jù)C-語言的規(guī)則,得出BNF語法如下: 1.program->declaration-list 2.declaration-list->declaration-list declaration | declaration 3.declaration->var-declaration|fun-declaration 4.var-declaration->type-specifier ID;|type-specfier IDNUM 5.type-specifier->int|void 6.fun-specifier ID(parans) compound

15、-stmt 7.params->params-list|void 8.param-list->param-list,param|param 9.param->type-specifier ID|type-specifier ID pound-stmt->local-declarations statement-list 11.local-declarations->local-declarations var-declaration|empty 12.statement-list->statement-list statement|empty 13.stat

16、ement->expression-stmt|compound-stmt|selection-stmt|iteration-stmt|return-stmt 14.expression-stmt->expression;|; 15.selection-stmt->if(expression)statement|if(expression)statement else statement 16.iteration-stmt->while(expression)statement 17.return-stmt->return ;|return expression;

17、18.expression->var=expression|simple-expression 19.var->ID|IDexpression 20.simple-expression->additive-expression relop additive-expression|additive-expression 21.relop-><=|<|>|>=|=|!= 22.additive-expression->additive-expression addop term|term 23.addop->+|- 24.term->

18、;term mulop factor|factor 25.mulop->*|/ 26.factor->(expression)|var|call|NUM 27.call->ID(args) 28.args->arg-list|empty 29.arg-list->arg-list,expression|expression2.1.2語法分析程序流程圖 2.1.3 各文件或函數(shù)的設(shè)計(jì)說明語法分析程序包括:parser.cpp,parser.hØ parser.cpp: Parser : Parser()/界面設(shè)計(jì) Token Parser : getTok

19、en()/獲取scanner中保存在TokenList數(shù)組中的Token,并且每次獲取完之后數(shù)組下標(biāo)指向下一個(gè)void Parser : syntaxError(string s)/出錯(cuò)處理void Parser : match(TokenType ex)/匹配出錯(cuò)TreeNode * Parser : declaration(void)/類型匹配錯(cuò)誤TreeNode * Parser : param_list(TreeNode * k)/k可能是已經(jīng)被取出來的VoidK,但又不是(void)類型的參數(shù)列表,所以一直傳到param中去,作為其一個(gè)子節(jié)點(diǎn)Ø parse.h:對(duì)parse

20、.c的函數(shù)聲明 /19種節(jié)點(diǎn)類型,分別表示int、id、void、數(shù)值、變量聲明、數(shù)組聲明、函數(shù)聲明、函數(shù)聲明參數(shù)列表、函數(shù)聲明參數(shù)、復(fù)合語句體、if、while、return、賦值、運(yùn)算、數(shù)組元素、函數(shù)調(diào)用、函數(shù)調(diào)用參數(shù)列表、未知節(jié)點(diǎn)typedef enum IntK, IdK, VoidK, ConstK, Var_DeclK, Arry_DeclK, FunK, ParamsK, ParamK, CompK, Selection_StmtK, Iteration_StmtK, Return_StmtK, AssignK, OpK, Arry_ElemK, CallK, ArgsK, Un

21、kownK Nodekind;typedef enum Void,Integer ExpType;ofstream fout_Tree("tokenTree.txt");/輸出語法樹到文件/treeNode定義 包括子節(jié)點(diǎn)、兄弟節(jié)點(diǎn)、所處行號(hào)、節(jié)點(diǎn)類型、屬性、表達(dá)式返回類型typedef struct treeNode TreeNode * newNode(Nodekind k);/根據(jù)節(jié)點(diǎn)類型新建節(jié)點(diǎn)TreeNode * declaration_list(void);TreeNode * declaration(void);TreeNode * params(void);

22、TreeNode * param_list(TreeNode * k);TreeNode * param(TreeNode * k);TreeNode * compound_stmt(void);TreeNode * local_declaration(void);TreeNode * statement_list(void);TreeNode * statement(void);TreeNode * expression_stmt(void);TreeNode * selection_stmt(void);TreeNode * iteration_stmt(void);TreeNode *

23、return_stmt(void);TreeNode * expression(void);TreeNode * var(void);TreeNode * simple_expression(TreeNode * k);TreeNode * additive_expression(TreeNode * k);TreeNode * term(TreeNode * k);TreeNode * factor(TreeNode * k);TreeNode * call(TreeNode * k);TreeNode * args(void);2.1.4 測(cè)試程序說明根據(jù)附錄A后面的例子,程序輸入兩個(gè)整數(shù)

24、,計(jì)算并打印出它們的最大公因子,保存為a.txt。/* A program to perform Eucild's Algorithm to compute gcd. */int gcd (int u, int v) if (v=0) return u; else return gcd(v,u-u/v*v); /* u-u/v*v= u mod v */void main(void) int x; int y; x=input(); y=input(); output(gcd(x,y);3. 程序代碼實(shí)現(xiàn)按文件列出主要程序代碼, 添加必要的注釋.Scanner.cpp:#include

25、 <cstdlib>#include <iostream>#include <fstream>#include <string>#include "scanner.h"#include<vector>using namespace std;/*Name: 詞法分析器Copyright: Author: XXXDate: 19-05-14 12:00Description: 提取出token*/Scanner : Scanner()scanSuccess = true;charIndex = 0;str = &quo

26、t;"commentFlag = true;sourseString = ""lineCount = 0;void Scanner : scan()cout<<"開始詞法分析."<<endl;bool doubleSym = false;getSourseStringFromFile("sourseFile.txt");int state = START;lineCount = 0;char ch;while(state<6)ch = getNextChar();if('0'=c

27、h)Token t;t.lineNo = lineCount;t.tokenString = ""t.tokenType = ENDFILE;tokenList.push_back(t);break;if(START=state)/初始狀態(tài)和空格state = charType(ch);if(state!=START)str += ch;else if(INNUM=state)/digitstate = charType(ch);if(state!=INNUM)state = DONE;elsestr += ch;else if(INID=state)/letterstat

28、e = charType(ch);if(state!=INID)state = DONE;elsestr += ch;else if(INDBSYM=state)/除了<>=!之外的各種符號(hào)if('='=ch)str += ch;doubleSym = true;elsedoubleSym = false;state = DONE;if(DONE=state)/接收狀態(tài)int tp = 0;if('n'=ch)tp = 1;Token t;t.lineNo = lineCount-tp;t.tokenString = str;t.tokenType

29、= returnTokenType(str);tokenList.push_back(t);if(ERROR=t.tokenType)scanSuccess = false;int lastState = charType(strstr.length()-1);if(lastState=INNUM | lastState=INID | (lastState=INDBSYM && doubleSym=false)backToLastChar();str = ""state = START;if(doubleSym=true)doubleSym = false;

30、 if(scanSuccess=false)cout<<"詞法分析出錯(cuò)!"<<endl;elsecout<<"詞法分析成功了!"<<endl;printToken();/輸出Token到文件Token.txt中Token Scanner : getTokenAt(int tokenIndex)Token token;token.lineNo = lineCount;token.tokenString = ""token.tokenType = ENDFILE;if(tokenIndex&

31、lt;tokenList.size()token = tokenList.at(tokenIndex+);return token;void Scanner : getSourseStringFromFile(string path)ifstream fin(path.c_str();string temp; sourseString = ""while(getline(fin,temp)sourseString += temp;sourseString += 'n' fin.close();charIndex = 0;void Scanner : dele

32、teComments()cout<<"正在刪除注釋."<<endl;ofstream fout_Sourse("sourseFile.txt");int state = 1;char ch;while(state<6)ch = getNextChar();if('0'=ch)/文件結(jié)束break;if(1=state)if('/'=ch)state = 2;elsestate = 1;fout_Sourse<<ch;else if(2=state)if('*'=ch

33、)state = 3;commentFlag = false; elsestate = 1;fout_Sourse<<"/"<<ch;else if(3=state)if('*'=ch)state = 4;elsestate = 3;else if(4=state)if('*'=ch)state = 4;else if('/'=ch)state = 5;elsestate = 3;if(5=state)/結(jié)束狀態(tài),處理commentFlag = true;state = 1;if(!commentFla

34、g)cout<<"注釋錯(cuò)誤,沒有結(jié)束符!"<<endl;scanSuccess = false;elsecout<<"注釋已經(jīng)成功刪除!"<<endl;TokenType Scanner : returnTokenType(string s)/返回Token的類型TokenType t;if(s="else")t = ELSE;else if(s="if")t = IF;else if(s="int")t = INT;else if(s="

35、;return")t = RETURN;else if(s="void")t = VOID;else if(s="while")t = WHILE;else if(s="+")t = PLUS;else if(s="-")t = MINUS;else if(s="*")t = TIMES;else if(s="/")t = OVER;else if(s="<")t = LT;else if(s="<=")t = L

36、EQ;else if(s=">")t = GT;else if(s=">=")t = GEQ;else if(s="=")t = EQ;else if(s="!=")t = NEQ;else if(s="=")t = ASSIGN;else if(s="")t = SEMI;else if(s=",")t = COMMA;else if(s="(")t = LPAREN;else if(s=")")t =

37、 RPAREN;else if(s="")t = LMBRACKET;else if(s="")t = RMBRACKET;else if(s="")t = LBBRACKET;else if(s="")t = RBBRACKET;else if(s="/*")t = LCOMMENT;else if(s="*/")t = RCOMMENT;else if(2=charType(ss.length()-1)t = NUM;else if(3=charType(ss.lengt

38、h()-1)t = ID;elset = ERROR;return t;DFAState Scanner : charType(char c)/返回字符的類型if(' '=c | 'n'=c | 't'=c |'r'=c)return START; else if(c>='0'&&c<='9')return INNUM; else if(c>='A'&&c<='Z')|(c>='a'&

39、;&c<='z')return INID;else if(c='<' | c='>' | c='=' | c='!')return INDBSYM; elsereturn DONE;char Scanner : getNextChar()if(charIndex<sourseString.length()char ch = sourseStringcharIndex;charIndex+;if('n'=ch)lineCount+;return ch;elseretur

40、n '0'void Scanner : backToLastChar()if(charIndex>0)char ch = sourseStringcharIndex-1;charIndex-;if('n'=ch)lineCount-;void Scanner : printToken()ofstream fout_Token("Token.txt");ifstream fin("sourseFile.txt");string temp; int lineCount = 0;int index = 0;while(ge

41、tline(fin,temp)fout_Token<<lineCount<<": "fout_Token<<temp<<endl;while(index<tokenList.size()Token t = tokenList.at(index);if(lineCount=t.lineNo)fout_Token<<" "<<lineCount<<": "index+;int width = 10;string headS = " &quo

42、t;if(t.tokenType>=1&&t.tokenType<=6)/關(guān)鍵字string tp = ""for(int i = 0; i<width-t.tokenString.length(); i+)tp += " "fout_Token<<"keyWord:"<<headS<<t.tokenString<<" "<<tp<<""<<tokenTypeStringt.to

43、kenType<<""<<endl;else if(t.tokenType>=7&&t.tokenType<=27)/符號(hào)string tp = ""for(int i = 0; i<width-t.tokenString.length(); i+)tp += " "fout_Token<<"symbols:"<<headS<<t.tokenString<<" "<<tp<

44、<""<<tokenTypeStringt.tokenType<<""<<endl;else if(t.tokenType=28)/NUMstring tp = ""for(int i = 0; i<width-t.tokenString.length(); i+)tp += " "fout_Token<<" NUM:"<<headS<<t.tokenString<<" "<

45、<tp<<""<<tokenTypeStringt.tokenType<<""<<endl;else if(t.tokenType=29)/IDstring tp = ""for(int i = 0; i<width-t.tokenString.length(); i+)tp += " "fout_Token<<" ID:"<<headS<<t.tokenString<<" &q

46、uot;<<tp<<""<<tokenTypeStringt.tokenType<<""<<endl;else if(t.tokenType=30)/錯(cuò)誤string tp = ""for(int i = 0; i<width-t.tokenString.length(); i+)tp += " "fout_Token<<" error:"<<headS<<t.tokenString<&l

47、t;" "<<tp<<""<<tokenTypeStringt.tokenType<<""<<endl;else if(t.tokenType=ENDFILE)/結(jié)束fout_Token<<" "<<lineCount<<": "fout_Token<<t.tokenString<<" "<<""<<tokenTy

48、peStringt.tokenType<<""<<endl;if(lineCount<t.lineNo)break;lineCount+;fin.close();fout_Token.close();scanner.h:#include<string>#include<vector>using namespace std;/定義的Token的類型(31種),分別對(duì)應(yīng)于else、if、int、return、void、while、+、-、*、/、<、<=、>、>=、=、!=、=、;、,、(、)、/*、

49、*/、num、id、錯(cuò)誤、結(jié)束typedef enumELSE = 1,IF,INT,RETURN,VOID,WHILE,PLUS,MINUS,TIMES,OVER,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN,RPAREN,LMBRACKET,RMBRACKET,LBBRACKET,RBBRACKET,LCOMMENT,RCOMMENT,NUM,ID,ERROR,ENDFILE TokenType;typedef enumSTART = 1, INNUM, INID, INDBSYM, DONE DFAState;/定義的Token結(jié)構(gòu)體,包括類

50、型、對(duì)應(yīng)的串、所在代碼的行號(hào)struct TokenTokenType tokenType;string tokenString;int lineNo; /每種TokenType對(duì)應(yīng)的串,如tokenTypeStringELSE="ELSE"const string tokenTypeString32 = "OTHER", "ELSE", "IF", "INT", "RETURN", "VOID", "WHILE", "PLU

51、S", "MINUS", "TIMES", "OVER", "LT", "LEQ", "GT", "GEQ", "EQ", "NEQ", "ASSIGN", "SEMI", "COMMA", "LPAREN", "RPAREN", "LMBRACKET", "RMBRACKET&

52、quot;, "LBBRACKET", "RBBRACKET", "LCOMMENT", "RCOMMENT", "NUM", "ID", "ERROR", "ENDFILE"class Scannerpublic:bool scanSuccess;/詞法分析是否成功的標(biāo)志void getSourseStringFromFile(string s);/通過提供的文件名獲取源代碼void deleteComments();/刪除注釋voi

53、d scan();/詞法分析,將分析的Token放在tokenList數(shù)組中Scanner();Token getTokenAt(int);/根據(jù)下標(biāo)從tokenList數(shù)組中獲取Tokenprivate:DFAState charType(char);/返回字符的類型,如:空格2:數(shù)字3:字母等char getNextChar();/獲取到下一個(gè)字符void backToLastChar();TokenType returnTokenType(string s);/根據(jù)字符串返回Token類型void printToken();/將詞法分析好的Token輸出到文件Token.txt中stri

54、ng sourseString;/獲取源代碼的字符串int charIndex;/配合getNextChar(),指定要取的字符位置string str;/在分析過程中保存Token對(duì)應(yīng)的串bool commentFlag;/標(biāo)注注釋開始的標(biāo)志int lineCount;/對(duì)行號(hào)計(jì)數(shù),每次獲取到'/n'就自增vector<Token> tokenList;/保存的Token序列;Parser.cpp:#include "scanner.h"#include "parser.h"#include <iostream>

55、#include <string>using namespace std;Parser : Parser()step = 0;tokenIndex = 0;Error = false;string path = "a.txt"cout<<"請(qǐng)輸入文件名:"cin>>path;scanner.getSourseStringFromFile(path);scanner.deleteComments();if(scanner.scanSuccess)scanner.scan();if(scanner.scanSuccess)

56、cout<<"開始語法分析."<<endl;syntaxTree = parse();printTree(syntaxTree);if(Error)cout<<"語法分析過程出錯(cuò)!"<<endl;elsecout<<"語法分析成功!"<<endl;Token Parser : getToken()/獲取scanner中保存在TokenList數(shù)組中的Token,并且每次獲取完之后數(shù)組下標(biāo)指向下一個(gè)lastToken = currentToken;currentTo

57、ken = scanner.getTokenAt(tokenIndex+);return currentToken;void Parser : syntaxError(string s) fout_Tree<<s<<"-> Syntax error at line "<<lastToken.lineNo<<" 出錯(cuò)附近Token:"<<lastToken.tokenString<<" Token類型:"<<tokenTypeStringlastToken.tokenType<

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論