版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验一 词法分析班级:计科12-3 学号:08123282 姓名:樊鑫一 实验目的1、 学会针对DFA转换图实现相应的高级语言源程序。2、 深刻领会状态转换图的含义,逐步理解有限自动机。3、 掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。二 实验内容TINY计算机语言的编译程序的词法分析部分实现。从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token)送给语法分析程序。为了简化程序的编写,有具体的要求如下:(1) 数仅仅是整数。(2) 空白符仅仅是空格、回车符、制表符。(3) 代码是自由格式。(4) 注释应放在花括号之内,并且不允许嵌套三 实验要求要求实现编
2、译器的以下功能:(1) 按规则拼单词,并转换成二元式形式(2) 删除注释行(3) 删除空白符 (空格、回车符、制表符)(4) 列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并且打印出每行包含的记号的二元形式(5) 发现并定位错误,词法分析进行具体的要求:(1) 记号的二元式形式中种类采用枚举方法定义;其中保留字和特殊字符是每个都一个种类,标示符自己是一类,数字是一类;单词的属性就是表示的字符串值。(2) 词法分析的具体功能实现是一个函数GetToken(),每次调用都对剩余的字符串分析得到一个单词或记号识别其种类,收集该记号的符号串属性,当识别一个单词完毕,采用返回值的形式返回符号
3、的种类,同时采用程序变量的形式提供当前识别出记号的属性值。这样配合语法分析程序的分析需要的记号及其属性,生成一个语法树。(3) 标示符和保留字的词法构成相同,为了更好的实现,把语言的保留字建立一个表格存储,这样可以把保留字的识别放在标示符之后,用识别出的标示符对比该表格,如果存在该表格中则是保留字,否则是一般标示符。四 实验程序#include <iostream>#include <iomanip>#include <ctype.h>#include <fstream>#include <string>using namespace
4、 std;enum WordType WRONG, NUMBER, BIAOSHI, IF, THEN, ELSE, END, REPEAT, UNTIL, /9READ, WRITE, PLUS, SUBTRACT, MULTIPLY, DIVIDEY, EQUAL, LESSTHAN, COLON,/18ASSIGNMENT, LINE_FEED, SPACE, TAB, BRACKET_L, BRACKET_R; /24enum CharType ALPHABET, OTHER;enum WrongType ZERO, ALP_NUM, NUM_ALP, UNLEAGL_S, NO_MA
5、TCH, UNKNOW;char *Words = "wrong", "number", "biaoshi", "if", "then", "else", "end", "repeat", "until", /9"read", "write", "+", "-", "*", "/", "=
6、", "<", ":",/18":=", "n", " ", "", "", "" /24typedef structchar *str;int wordtype;Two;char ArrayChar100, cbuffer;int i=-1, numline = 1, wordtype;string LineChar;Two T;ifstream fp("source.txt",ios:in);in
7、t main ()void HandleAlphabet();void HandleNumber ();void HandleOther ();if (!fp)cout<<"文件打开错误!"<<endl;elsecout << setiosflags (ios:left) << setw (6) << "行数" << "("cout << setiosflags (ios:left) << setw (10)<< "类
8、别编码" << ","cout << setiosflags (ios:left) << setw (20) << "字符" << ")" << endl;fp.get (cbuffer);while (!fp.eof ()if(cbuffer = 'n')/忽略换行符cout << "第" << numline << " 行所有字符:" << Lin
9、eChar << endl;numline+;LineChar = ""fp.get(cbuffer);else if (cbuffer = ' ')/忽略空字符LineChar += " "fp.get(cbuffer);else if (cbuffer = '')/忽略制表符LineChar += ""fp.get(cbuffer);else if (isalpha(cbuffer)/判断是否是字母HandleAlphabet ();else if (isdigit(cbuffer)/判
10、断是否是数字HandleNumber ();else /其他字符HandleOther ();i = -1;cout << "第" << numline << " 行所有字符:" << LineChar << endl;fp.close ();system ("pause");return 0;int Match(char str, int chartype)/查找匹配的字符int i;switch (chartype)case ALPHABET:for (i = IF; i
11、 <= WRITE; i+)if (strcmp(Wordsi,str) = 0)return i;case OTHER:for (i = PLUS; i <= ASSIGNMENT; i+)if (strcmp(Wordsi,str) = 0)return i;returnWRONG;void TypeWrong (int wrongtype, int line)switch (wrongtype)case ZERO:break;case ALP_NUM:cout << "字母后面不能紧跟数字!"break;case NUM_ALP:cout &l
12、t;< "数字后面不能紧跟字母!"case UNLEAGL_S:break;cout << "非法特殊符号!"break;case NO_MATCH:cout << "没有与第" << line << "行""匹配的""!" break;default:cout << "其它类型错误!"break;Two ConvertTwo (char str, int wordtype, int wro
13、ngtype, int numline, int line)/进行二元转换Two T;T.wordtype = wordtype;T.str = str;cout << setiosflags (ios:left) << setw (6) << numline << "("cout << setiosflags (ios:left) << setw (10)<< T.wordtype << ", "cout << setiosflags (ios:
14、left) << setw (20) << T.str << ")"if (T.wordtype = WRONG)TypeWrong (wrongtype, line);cout << endl;return T;void HandleAlphabet ()/首字符为字母时的处理bool mark = true;while(!fp.eof() && isalpha(cbuffer)ArrayChar+i=cbuffer;fp.get(cbuffer);if (isdigit (cbuffer)mark = fa
15、lse;while(!fp.eof() && (isalpha(cbuffer)|isdigit(cbuffer)ArrayChar+i=cbuffer;fp.get(cbuffer);ArrayChari+1='0'LineChar += ArrayChar;if (mark)wordtype = Match(ArrayChar, ALPHABET);T = ConvertTwo(ArrayChar,(BIAOSHI > wordtype ? BIAOSHI : wordtype), ZERO, numline, numline);elseT = Con
16、vertTwo(ArrayChar,WRONG, ALP_NUM, numline, numline);void HandleNumber ()/首字符为数字时的处理bool mark = true;while (!fp.eof() && isdigit(cbuffer)ArrayChar+i=cbuffer;fp.get(cbuffer);if (isalpha(cbuffer)mark = false;while(!fp.eof() && (isalpha(cbuffer)|isdigit(cbuffer)ArrayChar+i=cbuffer;fp.get
17、(cbuffer);ArrayChari+1='0'LineChar += ArrayChar;if (mark)T = ConvertTwo(ArrayChar, NUMBER, ZERO, numline, numline);elseT = ConvertTwo(ArrayChar,WRONG, NUM_ALP, numline, numline);void DeleteNote ()/删除注释int record = numline;while (!fp.eof() && cbuffer != '')fp.get(cbuffer);whil
18、e (!fp.eof() && cbuffer != '')if (cbuffer = 'n')ArrayChar i + 1 = '0'LineChar += ArrayChar;cout << "第" << numline << " 行所有字符:" << LineChar << endl;LineChar = ""numline+;i = -1;fp.get(cbuffer);ArrayChar+i=cbuf
19、fer;fp.get(cbuffer);ArrayChari + 1='0'if (cbuffer = '')ArrayChar +i = ''ArrayChari + 1='0'T = ConvertTwo("",BRACKET_R, ZERO, numline, numline);else T = ConvertTwo("", WRONG, NO_MATCH, numline, record);LineChar += ArrayChar;fp.get(cbuffer);void HandleOther ()/字符为特殊字符时的处理ArrayCh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外出会诊制度
- 消毒供应室管理质量考核标准
- 精-品解析:北师大版七年级数学下册总复习题(解析版)
- 福建省宁德市2025-2026学年高考考前提分语文仿真卷含解析
- 26年银发怕冷问题解决方案课件
- 【2025】沈阳市铁西区启工街道工作人员招聘考试真题
- 医学26年:尿毒症周围神经病诊疗 查房课件
- 【2026年】公务员考试宁夏(面试题)模拟试题集解析
- 26年银发生命体征记录规范课件
- 26年老年患者生理特征教学
- 2026石家庄新天智慧能源有限公司招聘44人考试备考试题及答案解析
- 2026中铝宁夏能源集团有限公司西藏金龙铜矿源网荷储一体化综合供电项目定向招聘55人笔试备考题库及答案解析
- 2026春季江西铜业集团有限公司贵溪冶炼厂校园招聘变更20人笔试备考试题及答案解析
- 2026年全民营养周营养餐桌家庭健康宣传课件
- 算电协同发展契机 (课件)
- 2026年四川省成都市网格员招聘考试参考试题及答案解析
- ISO140012026标准解读文件
- 机关工会财务审批制度
- 八年级义务教育劳动国测模拟试题
- 2026年职工职业技能竞赛(泵站运行工赛项)参考试指导题库(含答案)
- 2026年如何制定有效的设备维护计划
评论
0/150
提交评论