java实现的词法分析

上传人:ji****72 文档编号:37542782 上传时间:2018-04-18 格式:DOCX 页数:22 大小:565.98KB
返回 下载 相关 举报
java实现的词法分析_第1页
第1页 / 共22页
java实现的词法分析_第2页
第2页 / 共22页
java实现的词法分析_第3页
第3页 / 共22页
java实现的词法分析_第4页
第4页 / 共22页
java实现的词法分析_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《java实现的词法分析》由会员分享,可在线阅读,更多相关《java实现的词法分析(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词法分析器程序一 词法

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

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

4、符或界符或非法字符+,*, (, )等2.2 单词种别定义program1not8常数15.22begin2if9+16;23end3then10*17/24var4else11:=18/*25int5while12(19*/26and6do13)20or7标识符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 ExceptionStringBuffer le

6、xSegment=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.length()-1;while(column

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

8、olumn+;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.append(“标志符“,lexSeg

9、ment.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); isFinished=true;con

10、tinue;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(“运算符“,symbol4,1,signal.binaryTeam

11、LengthUsed); 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;continue;elseSystem.out.

12、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,signal.binaryTeamLengthUs

13、ed); 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); column-;continue;el

14、se 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.一行文本结束标志是如何识别,如何处理的? 答:每次读入一行,当扫描字符的游标值等于行长度时,该行文本以结束。 8.可以识别的输入文本的行数是否有限制?每行的长度是否有限制?为什么? 答:文本行数无限制。因为是每次读入一行,所以行数的增加只是增加了循环的次数。每编译原理综合训练课程设计报告22行的长度应小于 String 类型的最大长度,因为每次读入一行,存于一个 String 类型的变量 中。 9.如果输入文件是空文件,程序能否正

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号