ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:71.66KB ,
资源ID:4993838      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4993838.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理实验一词法分析器.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理实验一词法分析器.docx

1、编译原理实验一词法分析器实 验 报 告课程名称 编译原理 实验名称 词法分析器 实验类型 设计型 实验地点 405机 房实验日期 2015/12 指导教师 专 业 软件工程 班 级 学 号 姓 名 成 绩 辽宁石油化工大学计算机与通信工程学院实验报告说明 1、 封面内容(1)课程名称:实验所属的课程的名称。(2)实验名称:要用最简练的语言反映实验的内容。要求与实验指导书中相一致。(3)实验类型:说明是验证型实验、设计型实验、创新型实验还是综合型实验。2、正文内容 实验报告的正文内容须包括以下内容:(1)实验目的:目的要明确,要抓住重点,符合实验指导书中的要求。(2)实验内容:说明本实验的主要内

2、容。(3)实验原理:简要说明本实验项目所涉及的理论知识。(4)实验环境:实验用的软硬件环境(配置)。(5)实验方案:对于验证性型实验,写明依据何种原理、操作方法进行实验;对于设计型和综合型实验,写明依据何种原理、操作方法进行实验,并画出硬件组成图、软件流程图、设计思路和设计方法,再配以相应的文字说明;对于创新型实验,除符合设计型和综合型实验要求外,还应注明其创新点、特色。(6)实验步骤:写明实验的实施步骤,包括实验过程中的记录、数据。(7)实验结果与分析:写明实验的最终结果,并对结果进行分析,做出结论。(8)实验中遇到的问题及解决方法:写明实验过程中遇到的问题及所采取的解决方法。(9)实验总结

3、(在封底上):写出对本次实验的心得体会、思考和建议。一、 实验目的设计,编制,调试一个词法分析程序-识别单词,加深对词法分析原理的理解。二、 实验要求构造一个自己设计的小语言的词法分析器:1、这个小语言能说明一些简单的变量 识别诸如begin,end,if,while等保留字;识别非保留字的一般标识符(有下划线、字符、数字,且第一个字符不能是数字)。识别数字序列(整数和小数);识别:=,=之类的特殊符号以及;,(,)等界符。2、相关过程(函数): Scanner()词法扫描程序,提取标识符并填入display表中3、这个小语言有顺序结构的语句4、这个小语言能表达分支结构的语句5、这个小语言能够

4、输出结果;三、 算法设计 单词种别码设计: 状态种别编码种类解释0初态121关键字32变量标识符由字母下划线数字组成,且第一位不能是数字4读入了数字53整数64小数7小数点个数出错,大于18读入了96双目运算、=105单目运算126双目运算=135单目运算145单目运算+、*、/、=、#用default实现15读入了:166双目运算:=177界符(、)、,、;、:、用变量errorflag实现四、 程序源代码1 使用环境: vc+6.0,win8;2 源代码:#include #include #include #include #include #include using namespac

5、e std;#define Max 655 #define WordMaxNum 256 /变量最大个数#define DigitNum 256 /常量最大个数#define MaxKeyWord 32 /关键字数量#define MaxOptANum 8 /运算符最大个数#define MaxOptBNum 4 /运算符最大个数#define MaxEndNum 11 /界符最大个数typedef struct DisplayTable int Index; /标识符所在表的下标 int type; /标识符的类型 int line; /标识符所在表的行数 char symbol20; /标

6、识符所在表的名称Table; int TableNum = 0; /display表的下标 char WordWordMaxNum20; /标识符表 char DigitWordMaxNum20; /数字表 int WordNum = 0; /变量表的下标 int DigNum = 0; /常量表的下标 bool errorFlag = 0; /错误标志 const char* const KeyWordMaxKeyWord = and, array, begin, case,char constant, do, else, end, false,for, if, input, integer

7、, not, of, or, output,packed,procedure, program, read, real,repeat, set, then, to, type, until, var,while, with,prn; /关键字 const char OptA = +,-,*,/,=,#,; / 单目运算 const char *OptB = =,:=,; /双目运算符 const char End = (, ) , , , ; , . , , , : , , , ; / 界符 void error(char str20,int nLine, int errorType) cou

8、t nError : ; switch(errorType) case 1: cout 第 nLine-1 行 str 变量的长度超过限制!n; errorFlag = 1; break; case 2: cout 第 nLine-1 行 str 小数点错误!n; errorFlag = 1; break; case 3: cout 第 nLine-1 行 str 常量的长度超过限制!n; errorFlag = 1; break; /error void Scanner(char ch,int chLen,Table tableMax,int nLine) int chIndex = 0;

9、while(chIndex 20) /标识符超过规定长度,报错处理 error(str,nLine,1); else int i; for(i = 0;i = MaxKeyWord) tableTableNum.Index = WordNum; strcpy(WordWordNum+,str); tableTableNum.type = 2; /变量标识符 strcpy(tableTableNum.symbol,str); tableTableNum.line = nLine; TableNum +; else if(isdigit(chchIndex) int flag = 0; char

10、str256; int strLen = 0; while(isdigit(chchIndex) | chchIndex = .) if(chchIndex = .) flag +; strstrLen + = chchIndex; chIndex +; strstrLen = 0; if(strlen(str) 20) error(str,nLine,3); if(flag = 0) tableTableNum.type = 3; /整数 if(flag = 1) tableTableNum.type = 4; /小数 if(flag 1) error(str,nLine,2); table

11、TableNum.Index = DigNum; strcpy(DigitDigNum +,str); strcpy(tableTableNum.symbol,str); tableTableNum.line = nLine; TableNum +; /*运算符*/ else int errorFlag; /用来区分是不是无法识别的标识符,0为运算符,1为界符 char str3; str0 = chchIndex; str1 = chchIndex + 1; str3 = 0; for(int i = 0;i = MaxOptBNum) for( int k = 0;k MaxOptANum

12、; k+) if(OptAk = chchIndex) errorFlag = 0; tableTableNum.type = 5; tableTableNum.symbol0 = chchIndex; tableTableNum.symbol1 = 0; tableTableNum.line = nLine; tableTableNum.Index = k; TableNum +; chIndex +; break; /*界符*/ for(int j = 0;j MaxEndNum;j +) if(Endj =chchIndex) errorFlag = 1; tableTableNum.l

13、ine = nLine; tableTableNum.symbol0 = chchIndex; tableTableNum.symbol1 = 0; tableTableNum.Index = j; tableTableNum.type = 7; TableNum +; chIndex +; /*其他无法识别字符*/ if(errorFlag != 0 & errorFlag != 1) /开头的不是字母、数字、运算符、界符 char str256; int strLen = -1; strstrLen + = chchIndex; chIndex +; while(*ch != | *ch

14、!= 9 | chchIndex != 10)/ strstrLen + = chchIndex; chIndex +; strstrLen = 0; tableTableNum.type = 8; strcpy(tableTableNum.symbol,str); tableTableNum.line = nLine; tableTableNum.Index = -2; TableNum +; void Trans(double x,int p) /把十进制小数转为16进制 int i=0; /控制保留的有效位数 while(ip) if(x=0) /如果小数部分是0 break; /则退出

15、循环 else int k=int(x*16); /取整数部分 x=x*16-int(k); /得到小数部分 if(k=9) coutk; else coutchar(k+55); ; i+; ; ; int main() ifstream in; ofstream out,outVar,outCon; char in_file_name26,out_file_name26; /读入文件和写入文件的名称 char chMax; /存放输入代码的缓冲区 int nLine = 1; /初始化行数 Table *table = new TableMax; int choice; cout choi

16、ce; switch(choice) int i;/*从文件读取*/ case 1: coutin_file_name; in.open(in_file_name); if(in.fail() /打开display表读文件失败 coutInputput file opening failed.n; exit(1); coutout_file_name; out.open(out_file_name); outVar.open(变量表.txt); outCon.open(常量表.txt); if(out.fail() /打开display表写文件失败 coutOutput file openin

17、g failed.n; exit(1); if(outVar.fail() /打开变量表写文件失败 coutVarOutput file opening failed.n; exit(1); if(outCon.fail() /打开常量表写文件失败 coutConstOutput file opening failed.n; exit(1); in.getline(ch,Max,#); Scanner(ch, strlen(ch),table,nLine); /调用扫描函数 if(errorFlag = 1) /出错处理 return 0; /*把结果打印到各个表中*/ out 类型 下标 e

18、ndl; for( i = 0; i TableNum;i +)/打印display out (0x hex tablei.type , 0x hex tablei.Index ) endl; /在文件testout.txt中输出 outCon 下标 常量值 endl; for(i = 0;i TableNum;i+) /打印常量表 if(tablei.type = 3) long num1; num1 = atoi(tablei.symbol); outCon (0x hex tablei.Index , 0x hex num1 ) endl; if(tablei.type = 4) dou

19、ble num2; num2 = atof(tablei.symbol); outCon (0x hex tablei.Index , 0x hex num2 ) endl; outVar 类型 变量名称 endl; for( i = 0; i WordNum;i +)/打印变量表 outVar (0x hex i Wordi ) endl; /在文件testout.txt中输出 in.close();/关闭文件 out.close(); outVar.close(); outCon.close(); break;/*从键盘输入*/ case 2: cin.getline(ch,Max,#);

20、 Scanner(ch, strlen(ch),table,nLine); /调用扫描函数 if(errorFlag = 1) return 0; cout nDisplay表: n; cout 类型 下标 endl; /dos界面下 for( i = 0; i TableNum;i +) cout (0x hex tablei.type , 0x hex tablei.Index ) endl; cout n常量表:n 下标 常量值 endl; for(i = 0;i TableNum;i+) /打印常量表 if(tablei.type = 3) long num1; num1 = atoi(tablei.symbol); cout (0x hex tablei.Index , 0x hex num1 ) endl; if(tablei.typ

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1