Tiny语言的词法分析器-C++版-课程设计报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

专业资料word完美格式实验报告学号:姓名:专业:计算机科学与技术班级:2班第9周课程名称编译原理课程设计实验课时8实验项目手工构造Tiny语言的词法分析器实验时间7-10周实验目的熟悉Tiny语言词法;构造DFA;设计数据类型、数据结构;用C++实现Tiny语言的词法分析器实验环境Windows10专业版MicrosoftVisualStudio2013实验内容(算法、程序、步骤和方法)一、Tiny语言记号ReservedwordsSpecialSymbolsOtherif+number(1ormoredigits)then-else*endrepeat=until/identifier(1ormoreletters)read(write);:=专业资料word完美格式二、构造Tiny语言DFAID:letter(letter)*Number:digit(digit)*专业资料word完美格式三、根据DFA编写词法分析器#includefstream#includestring#includeiostreamusingnamespacestd;staticintrowCounter=1;//静态变量,用于存储行数staticboolbracketExist=false;//判断注释存在与否,false为不存在classLex{public:ofstreamoutput;专业资料word完美格式stringline=;Lex(stringinputLine){line=inputLine;scan(Trim(line));rowCounter++;}stringTrim(string&str)//函数用于去除每行前后空格{ints=str.find_first_not_of(\t);inte=str.find_last_not_of(\t);str=str.substr(s,e-s+1);str+=\0;returnstr;}voidscan(stringinputLine){ofstreamoutput;output.open(SampleOutput.txt,ios::app);stringline=inputLine;inti=0;stringstr=;inttemp;stringtoken=;outputrowCounter:lineendl;//输出每行while(line[i]!='\0')//根据DFA扫描并判断{if(line[i]=='{')//注释{bracketExist=true;}if(bracketExist==true){output\trowCounter:;专业资料word完美格式while(line[i]!='}'){outputline[i];//不处理,直接输出if(line[i+1]!=NULL){i++;}elsebreak;}if(line[i]=='}')//注释结束{outputline[i]endl;bracketExist=false;}}if(bracketExist==false){//数字while(isdigit(line[i])){temp=temp*10+line[i];if(!isdigit(line[i+1])){output\trowCounter:NUM,val=temp-'0'endl;}if(line[i+1]!=NULL&&isdigit(line[i+1]))i++;elsebreak;}temp=0;专业资料word完美格式//符号while(!(isdigit(line[i])||(line[i]='a'&&line[i]='z')||(line[i]='A'&&line[i]='Z')||line[i]==''||line[i]=='{'||line[i]=='}')){token=token+line[i];if(isdigit(line[i+1])||(line[i+1]='a'&&line[i+1]='z')||(line[i+1]='A'&&line[i+1]='Z')||line[i+1]==''||line[i+1]=='{'||line[i+1]=='}'||line[i+1]==NULL){if(isToken(token)){output\trowCounter:tokenendl;}else{intj=0;while(token[j]!='\0'){output\trowCounter:token[j]endl;j++;}}}else{i++;continue;}if(line[i+1]!=NULL)i++;elsebreak;}token=;//字母专业资料word完美格式while((line[i]='a'&&line[i]='z')||(line[i]='A'&&line[i]='Z')){str=str+line[i];if(!((line[i+1]='a'&&line[i+1]='z')||(line[i+1]='A'&&line[i+1]='Z'))){if(isResearvedWord(str))//判断是否是保留字{output\trowCounter:ReversedWord:strendl;break;}else{output\trowCounter:ID,name=strendl;break;}}if(line[i+1]!=NULL)i++;}str=;if(line[i+1]!=NULL){i++;}elsebreak;}if(line[i+1]==NULL){if(line[i]==';')output\trowCounter:line[i];break;}专业资料word完美格式}//清空,以备下一行读取line=;str=;temp=0;token=;outputendl;output.close();}boolisResearvedWord(strings)//存储保留字,并判断{stringreservedWord[8]={if,then,else,end,repeat,until,read,write};booljudge=false;for(inti=0;i8;i++){if(s==reservedWord[i]){judge=true;break;}}returnjudge;}boolisToken(strings)//存储符号,并判断{stringtoken[10]={+,-,*,/,=,,(,),;,:=};booljudge=false;for(inti=0;i10;i++){if(s==token[i]){judge=true;break;}}专业资料word完美格式returnjudge;}};intmain(){ifstreaminput;input.open(SampleInput.tny);stringline[50];inti=0;while(getline(input,line[i])){//coutline[i]endl;i++;}input.close();coutendlendlReadingsourcefilecompleted!!endl;intj=0;remove(SampleOutput.txt);for(j=0;ji;j++){Lexlex(line[j]);}coutendlendlWritingfilecompleted!!endlendlendl;return0;}四、重要数据结构stringline[]:用于存储每一行的字符,并逐个读取分析。stringtoken[]:用于存储TINY语言的符号,并调用遍历进行判断。stringreservedWord[]:用于存储TINY语言的保留字,遍历进行判断,若为真,则输出Reservedword。专业资料word完美格式staticintrowCounter:静态变量,存储行号,每创建一个类的实例便加一。inttemp:用于存储数字,并输出。staticintbracketExist:静态变量,标记注释是否存在。stringtoken,str分别用于临时存储读取的符号的字母串。五、算法总结建立Lexclass,并读取每一行,创建Lex的实例,在Lex中处理。先判断是否在注释范围内,若是,则输出注释内容,直至产生“}”字符。若不在注释区内,则读取单个字符,根据DFA进行判断。若为符号,则当下一个字符不是符号时输出;若为数字,则继续往下读,直至下一个字符不是数字为止,输出。若为字母,继续读取,直至下一个字符不是字母,把这一串字母和预先定义的保留字比对,若是,则输出“Reservedword”,若不是,则输出“ID,name=”字样。一行处理完毕,便开始创建下一行实例,直至文件尾。数据记录和计算Tiny测试程序专业资料word完美格式结论(结果)1:{Sampleprogram1:{Sampleprogram2:inTINYlanguage-2:inTINYlanguage-3:computesfactorial专业资料word完美格式3:computesfactorial4:}4:}5:readx;{inputaninteger}5:ReversedWord:read5:ID,name=x5:;5:{inputaninteger}6:if0xthen{don'tcomputeifx=0}6:ReversedWord:if6:NUM,val=06:6:ID,name=x6:ReversedWord:then6:{don'tcomputeifx=0}7:fact:=1;7:ID,name=fact7::=7:NUM,val=17:;专业资料word完美格式8:repeat8:ReversedWord:repeat9:fact:=fact*x;9:ID,name=fact9::=9:ID,name=fact9:*9:ID,name=x9:;10:x:=x-1;10:ID,name=x10::=10:ID,name=x10:-10:NUM,val=110:;11:untilx=0;11:ReversedWord:until11:ID,name=x11:=专业资料word完美格式11:NUM,val=011:;12:writefact{outputfactorialofx}12:ReversedWord:write12:ID,name=fact12:{outputfactorialofx}13:end13:ReversedWord:end小结顺利完成实验,熟悉了Tiny语言和其词法。根据语言和词法规则,顺利构造DFA。成功用C++语言,根据构造的DFA,实现了Tiny词法分析器。增强了自己的编程能力和水平技巧,尝试了很多以前没有尝试过的方法学习到了新知识。指导老师评议成绩评定:指导教师签名:

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功