收藏 分享(赏)

java实现的词法分析.docx

上传人:tkhy51908 文档编号:6772222 上传时间:2019-04-22 格式:DOCX 页数:22 大小:565.98KB
下载 相关 举报
java实现的词法分析.docx_第1页
第1页 / 共22页
java实现的词法分析.docx_第2页
第2页 / 共22页
java实现的词法分析.docx_第3页
第3页 / 共22页
java实现的词法分析.docx_第4页
第4页 / 共22页
java实现的词法分析.docx_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、编译原理综合训练课程设计报告1实验一:词法分析器一、 词法分析器程序的实验综述1.1 开发背景1.2 问题介绍1.3 词汇表二、 词法分析器程序的系统分析2.1 词法形式化描述2.2 单词种别定义2.3 状态转换图三、 词法分析器程序的系统设计 3.1 运行环境介绍3.2 关键算法流程图及文字解释3.3 用于处理注释的 skip 函数3.4 基于 trie 树的保留字搜索函数3.5 系统运行与调试四、 系统测评 图 0 系统开发流程图了解系统功能收集材料设计数据结构设计系统界面编辑代码运行并测试编译原理综合训练课程设计报告2词法分析器程序一 词法分析器程序的实验综述1.1 开发背景编译原理涉及

2、词法分析,语法分析,语义分析及优化设计等各方面。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号) 。词法分析程序实现这个任务。词法分析程序可以使用 Lex 等工具自动生成。从左到右逐个字符对构成源程序的字符串进行扫描,依据词法规则,识别出一个一个的标记(token) ,把源程序变为等价的标记串序列。执行词法分析的程序称为词法分析器,也称为扫描器。词法分析是所有分析优化的基础,涉及的知识较少,如状态转换图等,易于实现。本次实验使用 java 代码实现。1.2 问题介

3、绍 对某特定语言 A ,构造其词法规则。A 的内容如下:该语言的单词符号包括1. 保留字编译原理综合训练课程设计报告32. 运算符及界符3. 标识符(字母大小写不敏感) ,整型常数 1.3 词汇表对于后文正则式中可能出现的符号定义如下,以便清晰地描述 A 语言的正则式符号 说明a 字母b 数字c 符号(不包括字母和数字)* 闭包运算符| 或运算符. 连接运算符(可省略)空# 结束符二 词法分析器程序的系统分析2.1 词法形式化描述正则式 意义 举例编译原理综合训练课程设计报告4a(a|b)* 标识符或保留字 Lex1, programb* 常数 12345c 运算符或界符或非法字符 +,*,

4、(, )等2.2 单词种别定义program 1 not 8 常数 15 . 22begin 2 if 9 + 16 ; 23end 3 then 10 * 17 / 24var 4 else 11 := 18 /* 25int 5 while 12 ( 19 */ 26and 6 do 13 ) 20or 7 标识符 14 , 21对于标识符或保留字的推导 |.0|9aZ对于常数的推导 |0.9对于符号的推导 |=2.3 状态转换图编译原理综合训练课程设计报告5其中:编译原理综合训练课程设计报告6识别标识符或保留字识别常数识别加运算符识别乘运算符识别赋值运算符识别大于等于运算符,大于运算符并

5、加以区分识别小于等于运算符,不等于运算符,小于运算符并加以区分编译原理综合训练课程设计报告7识别括号,逗号,点号,分号,等于号其余所有无法被此状态转换图识别的符号视为非法符号。三 词法分析器程序系统设计3.1 运行环境介绍词法分析器程序由一个 java 控制台程序实现,通过读入一个名为 A.txt 的文本文件中的测试代码来对其进行词法分析。开发环境:MyEclipse 8.5,jdk1.6系统流程图:编译原理综合训练课程设计报告83.2 关键算法流程图及文字解释词法分析程序(Analysis 函数)详细流程图如下:编译原理综合训练课程设计报告9void analysis() throws Ex

6、ceptionStringBuffer lexSegment=new StringBuffer();StringBuffer digitSegment=new StringBuffer();/char next;try编译原理综合训练课程设计报告10while(true)program=in.readLine();if(program=null)if(line=0)System.out.println(“文件为空, “);break;elseSystem.out.println(“文件已编译完成 “);break;elseline+;column=-1;lineLength=program.l

7、ength()-1;while(column+lineLength)break;next=program.charAt(column);column-;编译原理综合训练课程设计报告11constant.append(“ 数字“,digitSegment.toString(),4,constant.binaryTeamLengthUsed);digitSegment.delete(0,digitSegment.length();continue;else if(now=AlexSegment.delete(0,lexSegment.length();continue;*/else if(Char

8、acter.isDigit(next)column+;while(Character.isDigit(next)lexSegment.append(next);column+;if(columnlineLength)break;next=program.charAt(column);column-;lex.append(“标志符“,lexSegment.toString(),4,lex .binaryTeamLengthUsed);lexSegment.delete(0,lexSegment.length();编译原理综合训练课程设计报告12continue;else if(nextz)lex

9、.append(“标志符“,lexSegment.toString(),5,lex .binaryTeamLengthUsed);lexSegment.delete(0,lexSegment.length();continue;else if(now.equals(+)signal.append(“运算符“ ,symbol0,1,signal.binaryTeamLengthUsed);isFinished=true;continue;else if(now.equals(*)signal.append(“运算符“ ,symbol1,1,signal.binaryTeamLengthUsed)

10、;isFinished=true;continue;else if(now.equals()signal.append(“运算符“ ,symbol2,1,signal.binaryTeamLengthUsed);isFinished=true;continue;else if(now.equals()signal.append(“运算符“ ,symbol3,1,signal.binaryTeamLengthUsed);isFinished=true;continue;else if(now.equals(,)编译原理综合训练课程设计报告13signal.append(“运算符“ ,symbol

11、4,1,signal.binaryTeamLengthUsed);isFinished=true;continue;else if(now.equals(.)signal.append(“运算符“ ,symbol5,1,signal.binaryTeamLengthUsed);isFinished=true;continue;else if(now.equals(:)column+;if(program.charAt(column)=)signal.append(“运算符“ ,symbol6,1,signal.binaryTeamLengthUsed);isFinished=true;cont

12、inue;elseSystem.out.println(“第“+line+“行出现非法字符:“);column-;continue;else if(now.equals(;)signal.append(“运算符“ ,symbol7,1,signal.binaryTeamLengthUsed);isFinished=true;if(column=lineLength)isAnnotation=true;continue;else if(column+1)column+;if(program.charAt(column)=)signal.append(“运算符“ ,symbol11,1,signa

13、l.binaryTeamLengthUsed);isFinished=true;continue;elsesignal.append(“运算符“ ,symbol8,1,signal.binaryTeamLengthUsed);column-;continue;else if(now.equals()signal.append(“运算符“ ,symbol13,1,signal.binaryTeamLengthUsed);isFinished=true;continue;elsesignal.append(“运算符“ ,symbol9,1,signal.binaryTeamLengthUsed);

14、column-;continue;else if(now.equals(=)signal.append(“运算符“ ,symbol10,1,signal.binaryTeamLengthUsed);isFinished=true;continue;else if(now.equals(/)if(column+1word.length()-1)/System.out.println(index);return true;if(word.charAt(hierarchy)=#)index=26;else if(word.charAt(hierarchy) “” = “”+“=” = “”+“空格”

15、+ “=” = = “”+“空格”+ “=”+“=” ,= 和= “”+“=”+“=” ,= 和=3st7 标识符 3st72 非法字符,以及 25.去注释算法描述,如何正确处理如下形式的注释:/* this is a * comm. / ent */ 答:由 skip 函数来处理。当 analysis 判定读入的字符串是/*时,调用此函数,skip 函数会从此行开始持续往后读入字符,直到出现结束标志*/ 。之后返回注释的结束行数及列数,继续词法分析。6.输入文件结束是如何处理的? 答:当 readLine 函数读入的内容为空时,说明文件已输入结束。7.一行文本结束标志是如何识别,如何处理的?

16、答:每次读入一行,当扫描字符的游标值等于行长度时,该行文本以结束。8.可以识别的输入文本的行数是否有限制?每行的长度是否有限制?为什么?答:文本行数无限制。因为是每次读入一行,所以行数的增加只是增加了循环的次数。每编译原理综合训练课程设计报告22行的长度应小于 String 类型的最大长度,因为每次读入一行,存于一个 String 类型的变量中。9.如果输入文件是空文件,程序能否正确执行?答:可以,直接判定文件为空。结果如下:实验总结通过实际操作,我们体会到了数据结构在程序设计中的地位。同时也真正体会到词法分析器具体的工作流程。从开始拿到题目的不知所措,到后来泡图书馆查找各种资料,到最后编码,书写报告,通过不断努力,最终完成了本次实验的全部设计过程,并且使该程序达到了可实际应用的程度。在本次程序的设计过程中,我们始终坚持理论联系实践的原则。通过这次程序设计,加强了对实际问题的处理能力。 同时,我们开始意识到我们开发有以下不足,也希望能得到老师的指点,今后的编程中得到改进。1 希望老师能够提供一些优化的方案,本次编写的词法分析器代码行数过多,原因是大量使用了 if 语句,不知道是否可以有一种简练的算法或表达形式来替换大量的 if-else参考文献1.程序设计语言编译原理(第三版) ,陈火旺等, 国防工业出版社,2000.12. JAVA API SUN

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报