版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验一词法分析实验目的1、学会针对DFA转换图实现相应的高级语言源程序。2、深刻领会状态转换图的含义,逐步理解有限自动机。3、掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。 二实验内容TINY计算机语言的编译程序的词法分析部分实现。从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token)送给语法分析程序。为了简化程序的编写,有具体的要求如下:( 1 )数仅仅是整数。( 2)空白符仅仅是空格、回车符、制表符。( 3)代码是自由格式。( 4)注释应放在花括号之内,并且不允许嵌套 三实验要求要求实现编译器的以下功能:( 1 )按规则拼单词 ,并转换成二元式形式(
2、2)删除注释行( 3)删除空白符 (空格、回车符、制表符 )( 4)列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并 且打印出每行包含的记号的二元形式( 5)发现并定位错误,词法分析进行具体的要求:( 1)记号的二元式形式中种类采用枚举方法定义;其中保留字和特殊字符 是每个都一个种类,标示符自己是一类,数字是一类;单词的属性就是表示的 字符串值。(2)词法分析的具体功能实现是一个函数GetToken(),每次调用都对剩余的字符串分析得到一个单词或记号识别其种类,收集该记号的符号串属性,当 识别一个单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的 形式提供当前识别出记号的
3、属性值。这样配合语法分析程序的分析需要的记号 及其属性,生成一个语法树。( 3)标示符和保留字的词法构成相同,为了更好的实现,把语言的保留字 建立一个表格存储,这样可以把保留字的识别放在标示符之后,用识别出的标 示符对比该表格,如果存在该表格中则是保留字,否则是一般标示符。源程序:/*测试时把测试的源程序存入当前目录中,并改名为 source.txt */#include#include#include#include#includeusingnamespacestd;enumWordType WRONG, NUMBER, BIAOSHI, IF, THEN, ELSE, END, REPEA
4、T, UNTIL,/9READ, WRITE, PLUS, SUBTRACT, MULTIPLY, DIVIDEY, EQUAL, LESSTHAN, COLON,/18ASSIGNMENT, LINE_FEED, SPACE, TAB, BRACKET_L, BRACKET_R;/24enumCharType ALPHABET, OTHER;enumWrongType ZERO, ALP_NUM, NUM_ALP, UNLEAGL_S, NO_MATCH, UNKNOW;char*Words = wrong,number,biaoshi,if,then,else,end,repeat,unt
5、il,/9read,write,+,-,*,/,=,I! II.10 / 10,/18=,nI! I! I! III! I!,;/24typedefstruct charArrayChar100, cbuffer;inti=-1, numline = 1, wordtype;string LineChar;Two T;ifstream fp(source.txt,ios:in); intmain () char*str; intwordtype;Two;voidHandleAlphabet(); voidHandleNumber (); voidHandleOther ();if(!fp)co
6、ut setiosflags (ios:left) setw(6) 行数 (;cout setiosflags (ios:left) setw(10)类别编码 , ;cout setiosflags (ios:left) setw(20) 字符) endl;fp.get (cbuffer);while(!fp.eof ()if(cbuffer =n)/ 忽略换行符 elseif(cbuffer = )/ 忽略空字符 elseif(cbuffer =)/ 忽略制表符 elseif(isalpha(cbuffer)/ 判断是否是字母 elseif(isdigit(cbuffer)/ 判断是否是数字
7、 else/ 其他字符HandleOther ();HandleNumber ();HandleAlphabet ();LineChar += ;fp.get(cbuffer);LineChar += ;fp.get(cbuffer);cout 第 numline 行所有字符: LineChar endl;numline+;LineChar =; fp.get(cbuffer);coutvv文件打开错误!e ndl;elsei = -1;cout 第 numline 行所有字符: LineChar endl;fp.close ();system (pause);return0;intMatch
8、(charstr,intchartype)/ 查找匹配的字符 voidTypeWrong (intwrongtype,intline)switch(wrongtype)caseZERO:break;cout 字母后面不能紧跟数字! ;break;cout 数字后面不能紧跟字母! ;break;cout 非法特殊符号! ;break;caseALP_NUM:inti;switch(chartype)caseALPHABET:returnWRONG;for(i = IF; i = WRITE; i+)for(i = PLUS; i = ASSIGNMENT; i+)if(strcmp(Wordsi
9、,str) = 0) returni;if(strcmp(Wordsi,str) = 0)returni;caseOTHER:caseNUM_ALP:caseUNLEAGL_S:caseNO_MATCH:cout 没有与第 line 行“匹”配的 “!”;break;cout 其它类型错误! ;break;default:Two ConvertTwo (charstr,intwordtype,intwrongtype,intnumline,intline)/ 进行 二元转换 voidHandleAlphabet ()/ 首字符为字母时的处理 ArrayChari+1=0;boolmark =t
10、rue;while(!fp.eof() & isalpha(cbuffer)if(isdigit (cbuffer)mark =false;while(!fp.eof() & (isalpha(cbuffer)|isdigit(cbuffer)ArrayChar+i=cbuffer;fp.get(cbuffer);ArrayChar+i=cbuffer;fp.get(cbuffer);returnT;cout setiosflags (ios:left) setw(6) numline (;cout setiosflags (ios:left) setw(10) T.wordtype , ;c
11、out setiosflags (ios:left) setw(20) T.str );if(T.wordtype = WRONG)TypeWrong (wrongtype, line);cout wordtype ? BIAOSHI : wordtype), ZERO, numline,numline);voidHandleNumber ()/ 首字符为数字时的处理 voidDeleteNote ()/ 删除注释 intrecord = numline;while(!fp.eof() & cbuffer !=)fp.get(cbuffer);while(!fp.eof() & cbuffer
12、 !=)boolmark =true;while(!fp.eof() & isdigit(cbuffer)if(isalpha(cbuffer)ArrayChari+1=0;LineChar += ArrayChar;if(mark)T = ConvertTwo(ArrayChar, NUMBER, ZERO, numline, numline);T = ConvertTwo(ArrayChar,WRONG, NUM_ALP, numline, numline);else mark =false;while(!fp.eof() & (isalpha(cbuffer)|isdigit(cbuffer)ArrayChar+i=cbuffer; fp.get(cbuffer);ArrayChar+i=cbuffer;fp.get(cbuffer);ArrayChari + 1=0;if(cbuffer =)elseT = ConvertTwo(, WRONG, NO_MATCH, numline, record);ArrayChar +i =;ArrayChari + 1=0;T = ConvertTwo(,BRACKET_R, ZERO, numline, numline); i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论