《哈工大 威海 编译原理 实验一 词法分析.doc》由会员分享,可在线阅读,更多相关《哈工大 威海 编译原理 实验一 词法分析.doc(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、哈尔滨工业大学(威海)计算机学院 编译原理 实验报告 姓名院系计算机学院学号任课教师 指导教师实验地点宋健二楼机房实验时间实验名称实验一 词法扫描器设计同 组 人无预习报告(对实验主要内容的认识)得分(1) 根据附录给定的文法,从输入的类C语言源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分隔符五大类;分发见最后附录。(2) 提供源程序输入界面;(3) 词法分析后可查看符号表和TOKEN串表;(4) 保存符号表和TOKEN串表(如:文本文件); 遇到错误时可显示提示信息,然后跳过错误部分继续进行分析。实验内容(问题,思路,程序,结果)得分(1) 开发环境:vs2010
2、(2) 输入:在运行打开的软件下(win32格式),输入相应的代码(即要进行词法分析的字符串)(3) 输出:在输入字符串后,按回车键后,既可以得到相应的词法分析的结果(4) 在相应的运行程序的文件夹中生成一个txt文件,用来存储生成的Token链表(5) 系统功能:1、 关键字解析:if else for while do return break continue。2、 字符串分析:可以键入的类型以字母开头的,字符串中可以有数字和下划线。3、 数字:数字的类型只能是整形的4、 边界符:, ; ( )5、 运算符:+,-,*,/6、 关系符:,=,=7、 错误检测:其他类型的输入,若错误类型在
3、一起,则将所有的类型组成一个类型。(2) 开发平台(操作系统、设计语言): 1、操作系统:windows 7 2、设计语言:c+ 3、编译器:vs2010(3) 设计方案;1) 主数据流图;开始接受字符串(用于词法分析)分析第一个字符的类型是字母?是数字?其他符号分析数字分析字符串和关键字分析进行下一次的分析直到完成结束2) 主要数据结构:符号表、TOKEN串表等。/符号表class symTableprivate:char* symName;char* symStyle;int symLength;public:symTable *next;public:symTable();symTabl
4、e(char* sysName,char* sysStyle,int sysLength);symTable(symTable &s);char* getName();char* getStyle();int getLength();void symAdd(symTable* symFirst);void print(); (4) 具体设计过程(包括主控程序、各个功能模块的具体实现)。1、主流程代码#include#include#includesymtable.h#include calphaprocess.h#include digitprocess.h#include otherproc
5、ess.h#include addSymtable.husing namespace std;char *code = new char3000;/存放输入的代码int ci;/在输入代码中的位置symTable Token = symTable(start,0,0);/token 表的首地址char *consts20;char *label20;bool flag = true;int constnum = 0,labelnum = 0;void main(void) for(int i=0;i=20;i+)/ 实现表的清空 labeli=nullptr; constsi=nullptr;
6、coutcode;int count = strlen(code);codecount = ;/设置 为结束符ci = 0; char buffer;buffer = codeci+;int i=0,j=0,k=0;symTable symAlp100;while(ci symAdd(&Token);/addSystable(&Token,symAlp);buffer = codeci+;while(buffer = )&(ci symAdd(&Token);/addSystable(&Token,&symDig);buffer = codeci+;while(buffer = )&(ci s
7、ymAdd(&Token);/symTable symOth(otherprocess(buffer);/symOth.symAdd(&Token);/addSystable(&Token,&symOth);buffer = codeci+;while(buffer = )&(ci = count)buffer = codeci+;if(buffer = )flag = false;continue;printf(词法分析完成!n);cout*endl;cout分析表的内容如下:endl;Token.print();cout*endl;system(pause);2、对于字符类型的输出(关键字
8、和字符串)#include calphaprocess.hextern char *code;/存放输入的代码extern int ci;/在输入代码中的位置extern symTable Token;extern bool flag;symTable alphaprocess(char buffer)int atype; int i = -1; char alphatp20; while (isalpha(buffer)|(isdigit(buffer)|(buffer = _)alphatp+i = buffer;buffer = codeci+;if(buffer = )flag = f
9、alse;break;/return or break? alphatpi+1=0; if(atype = search(alphatp,1)symTable s(alphatp,key,atype-1);/ 1 是类型 key -/atype - 1 为关键字在 key 中的位置ci-;return s; elseatype = search(alphatp,6);/alphatp 是字符串- str -是类型 - atype是str的长度。symTable s(alphatp,str,atype);ci-;return s;/s.symAdd(&Token);3、对于数字类型的分析#inc
10、lude digitprocess.hextern char *code;/存放输入的代码extern int ci;/在输入代码中的位置extern symTable Token;extern bool flag;symTable digitprocess(char buffer)int i=-1; char digittp20; int dtype; while(isdigit(buffer)digittp+i = buffer;buffer = codeci+;if(buffer = )flag = false;break; digittpi+1=0; dtype = search(di
11、gittp,5);symTable s(digittp,dig,dtype-1);/若digittp=111,名称则为“111”/dig 为类型为 数值型/s.symAdd(&Token);ci-;return s;4、对于其他类型的分析#include otherprocess.hextern char *code;/存放输入的代码extern int ci;/在输入代码中的位置extern symTable Token;symTable otherprocess(char buffer)int i=-1; char othertp20; int otype,otypetp;/otype 长
12、度 othertp0=buffer;/符号一般只有一个,其他情况可能有两个 othertp1=0; if(otype = search(othertp,3)/其他符号- 运算类型(4个符号: + - * / )symTable s(othertp,ari,otype-1);/s.symAdd(&Token);ci-;return s; if(otype = search(othertp,4)/如果是关系类型的字符,可能有双字符buffer = codeci+;/再添加一个字符,看看行不行while(buffer = )buffer = codeci+; othertp1 = buffer; o
13、thertp2=0; if (otypetp = search(othertp,4)/如果是双字符的关系类型的字符symTable s(othertp,rel,otypetp-1);/ s.symAdd(&Token);ci-;return s; else/如果不是双字符的关系类型的字符,还原原来字符othertp1=0;symTable s(othertp,rel,otype-1);/s.symAdd(&Token);ci-;return s;if (otype = search(othertp,2)symTable s(othertp,bor,otype-1);/s.symAdd(&Tok
14、en);/ci-;return s;if(buffer!=)&(buffer!= )symTable s(&buffer,0,0);/error?/s.symAdd(&Token);/ type 0 means there is a error in the char /printf(%c error,not a wordn,buffer);ci-;return s;/buffer=fgetc(fp);/buffer = cci+;实验结论得分通过这次试验,我对于词法分析的方法有了进一步的了解,对于如何进行预处理(这是在课堂上没有作为重点的),以及其他的一些对于字符串预处理的事情,关于类的使用,以及对象链表的建立,以及链表的变量的使用都有了更深的了解,这是在以前的课程设计中从未考虑过的实际的问题,以及解决变法。我想我对于C+语言的认识有了更深的认识。具体的错误的修改过程,以及对于算法的自己的思考都在源文件的注释中可以体现出来,关于错误处理的部分,需要和语法分析结合到一起,这里也只能对于不在输入范围内的字符或者是字符串进行有效的分析。教师评价总分实际得分