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

上传人:汽*** 文档编号:513678784 上传时间:2023-06-11 格式:DOCX 页数:12 大小:133.17KB
返回 下载 相关 举报
Tiny语言的词法分析器-C++版-课程设计报告_第1页
第1页 / 共12页
Tiny语言的词法分析器-C++版-课程设计报告_第2页
第2页 / 共12页
Tiny语言的词法分析器-C++版-课程设计报告_第3页
第3页 / 共12页
Tiny语言的词法分析器-C++版-课程设计报告_第4页
第4页 / 共12页
Tiny语言的词法分析器-C++版-课程设计报告_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《Tiny语言的词法分析器-C++版-课程设计报告》由会员分享,可在线阅读,更多相关《Tiny语言的词法分析器-C++版-课程设计报告(12页珍藏版)》请在金锄头文库上搜索。

1、实验报告学号:姓名:专业:计算机科学与技术班级:2班第9周课程名称编译原理课程设计实验课时8实验项目手工构造Tiny语言的词法分析器实验时间7-10周实验目的熟悉Tiny语言词法;构造DFA;设计数据类型、数据结构;用C+实现Tiny语言的词法分析器实验环境Windows10专业版MicrosoftVisualStudio2013实验内容(算法、程序、步骤和方法)一、Tiny语言记号ReservedwordsSpecialSymbolsOtherif+then-else*number(1ormoredigits)endrepeat=until/read(write)identifier。orm

2、oreletters);二、构造Tiny语言DFAID:letter(letter)*Number:digit(digit)*otherdigit三、根据DFA编写词法分析器#include#include#includeusingnamespacestd;staticintrowCounter=1;/静态变量,用于存储行数staticboolbracketExist=false;/判断注释存在与否,false为不存在classLexpublic:ofstreamoutput;stringline=;LexstringinputLine)line=inputLine;scan(Trim(lin

3、e);rowCounter+;stringTrim(string&str)/函数用于去除每行前后空格ints=t);inte=(t);str=(s,e-s+1);str+=0;returnstr;voidscan(stringinputLine)ofstreamoutput;(,ios:app);stringline=inputLine;inti=0;stringstr=;inttemp;stringtoken=;outputrowCounter:lineendl/输出每行while(linei!=0)/根据DFA扫描并判断if(linei=)/注释bracketExist=true;if(b

4、racketExist=true)outputtrowCounter:;while(linei!=)outputlinei;/不处理,直接输出if(linei+1!=NULLi+;elsebreak;)if(linei=)/注释结束(outputlineiendl;bracketExist=false;if(bracketExist=false)(/数字while(isdigit(linei)(temp=temp*10+linei;if(!isdigit(linei+1)(outputtrowCounter:NUM,val=temp-0=a&linei=A&linei=a&linei+1=A&

5、linei+1=Z)|linei+1=|linei+1=|linei+1=|linei+1=NULL)if(isToken(token)else(intj=0;while(tokenj!=0)(outputtrowCounter:tokenj=a&linei=A&linei=a&linei+1=A&linei+1=Z)(if(isResearvedWord(str)/判断是否是保留字I1outputtrowCounter:ReversedWord:strendl;break;elseendl;break;if(linei+1!=NULLi+;str=;if(linei+1!=NULLi+;el

6、sebreak;if(linei+1=NULLLif(linei=;)outputtrowCounter:linei;break;/清空,以备下一行读取line=;str=;temp=0;token=;outputendl;();boogsResearvedWordstrings)/存储保留字,并判断stringreservedWord8=if,then,else,end,repeat,until,read,write;booljudge=false;for(inti=0;i8;i+)if(s=reservedWordi)judge=true;();intmain();break;return

7、judge;boolisTokenstrings)/存储符号,并判断stringtoken10=+,booljudge=false;for(inti=0;i10;i+)if(s=tokeni)judge=true;break;returnjudge;ifstreaminput;stringline50;inti=0while(getline(input,linei)/coutlineiendl;i+;*,(,),=;coutendlendlReadingsourcefilecompleted!endl;intj=0;remove();for(j=0;ji;j+)Lexlex(linej);co

8、utendlendlWritingfilecompleted!endlendlendreturn0;四、重要数据结构stringline口:用于存储每一行的字符,并逐个读取分析。stringtoken口:用于存储TINY语言的符号,并调用遍历进行判断。stringreservedWord口:用于存储TINY语言的保留字,遍历进行判断,若为真,则输出Reservedword。staticintrowCounter:静态变量,存储行号,每创建一个类的实例便加一。inttemp:用于存储数字,并输出。staticintbracketExist:静态变量,标记注释是否存在。stringtoken,st

9、r分别用于临时存储读取的符号的字母用。五、算法总结建立Lexclass并读取每一行,创建Lex的实例,在Lex中处理。先判断是否在注释范围内,若是,则输出注释内容,直至产生“”字符。若不在注释区内,则读取单个字符,根据DFA进行判断。若为符号,则当下一个字符不是符号时输出;若为数字,则继续往下读,直至下一个字符不是数字为止,输出。若为字母,继续读取,直至下一个字符不是字母,把这一用字母和预先定义的保留字比对,若是,则输出“Reservedword,若不是,则输出“ID,name=字样一行处理完毕,便开始创建下一行实例,直至文件尾。Tiny测试程序|Sanaisprogram数据 readif

10、0inTINYlingua一confutesiactorial工:inputSUinteger记录xthen(donPtcomputeif豆| I (i|)/ 1 L【LUflSOi .110 g 4LIE. I o4nJuak3am |i) 1J/mnl Luc Ll eebU,. r+Eif idL Si aeril InriLue este 巾口 耳一vtE 广 电nt2:3::4.D HiTf-l proifs-ari1:1 白口 14a 怀rmCb TC1T Linp-Md -St Lb TEW-Knrao fart inri il3? m ftt-wUi Iv1 I c 4 c c u6 48r.- OG-h6H:H- ft-i ( iftuC mUtkm-1 lure J n id g Mkl-工(Sl*yl rig JtrlHgari n。乩(wi1 c cwjw sr 10 0) 公包 dLi以MXvrcwd larcJ thjn(d&r t etmp ii x b)177 h-7-ia八 . &覆田.测

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号