编译原理词法分析器实践报告_第1页
编译原理词法分析器实践报告_第2页
编译原理词法分析器实践报告_第3页
编译原理词法分析器实践报告_第4页
编译原理词法分析器实践报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、哈尔滨理工大学软件学院编译原理项目实践报告题 目:词法分析器班 级:软件15-4班专 业:软件工程姓名:吕小胜:学号:1514010414:指导教师:张春祥日期:2017年4月19日目录一、需求分析2二、系统设计2(一)系统中的数据定义2(二)系统的概要设计3(三)系统的详细设计3(四)系统的核心算法4三、系统编码及运行5(一)系统开发涉及的软件5(二)系统运行界面及结果5四、系统测试5五、总结5附录(源代码)5一、需求分析词法分析(lexical analysis) 是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个

2、词素。这个词法单元序列被输出到语法分析器进行语法分析。二、系统设计(一)系统中的数据定义本词法分析器演示的是c语言的一个子集,故字符集如下: (1)标识符:以字母开头的字母数字串。 (2)常熟(3)保留字:auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union,

3、unsigned, void, volatile, while (4)运算符:+、-、*、/、%、=、!=、=、=、+、-、!、&、&、|; (5) 界符: ( ) : “” # , 单词分类号标识符1常数2保留字3界符4运算符5单词分类表(二)系统的概要设计(三)系统的详细设计 1、testlexer()2、 void writefile(string str1,stringbuilder number)3、 boolean isdigit(char ch)4、 boolean isletter(char ch)5、 boolean iskeyword(stringbuilder str)6

4、、 boolean isoperator(char ch)7、 boolean isseparators(char ch) (四)系统的核心算法testlexer()程序入口stringbuffer buffer;文件读入缓冲区char cs;字符变量,存放源程序字符stringbuilder sb;字符串,存放切割出的字词boolean isletter(char ch)判断ch是否为字母boolean isdigit(char ch)判断是否为数字boolean iskeyword(string)判断是否为关键字boolean isoperator(char)判断是否为运算符boolean

5、 isseparators(char)判断是否为分隔符void writefile(string str1,stringbuilder number)按照二元式规则写入文件三、系统编码及运行(一)系统开发涉及的软件wps文字、eclipse、(2) 系统运行界面及结果 4、 系统测试五、总结 通过此次实验,让我了解到如何设计、编制并调试词法分析程序,熟悉了构造 词法分析程序的手工方式的相关原理,加深了对编译原理词法分析的理解,本次使用java语言直接编写此法分析程序,也让我重新熟悉了java语言的相关内容,加深了对java语言的用途的理解。本程序的数据输入采取直接从文件中读取,而不是由键盘输入

6、,因此在测试过程中,输入得到大大简化,但是本程序的关键字表只初始化了一部分关键字,还可继续扩充(只需扩大数组,向其中补充要添加的关键字),而且程序的测试数据存在不足,程序可能存在未发现的漏洞,以上两点有待改善。附录import java.io.file;import java.io.filereader;import java.io.filewriter;import java.io.ioexception;import java.io.inputstream;public class testlexer / 保留字集static string keywords = auto, break,

7、case, char, const,continue, default, do, double, else, enum, extern,float, for, goto, if, int, long, register, return,short, signed, sizeof, static, struct, switch,typedef, union, unsigned, void, volatile, while ;/ 运算符集static char operators = +,-,*,/,%,=,!,&,|;/ 界符集static char separators = , , , , (

8、, ), :, , ,#, ; ;public static void main(string args) throws exception / 读取文件file f = new file(d:/aa.txt);filereader r = new filereader(f);char cs = new char(int) f.length();int length = r.read(cs);system.out.println(cs);system.out.println(-);int flag = 0;stringbuilder sb = new stringbuilder();for (

9、int i = 0; i cs.length; i+) / 如果是字母if (isletter(csi) if(csi+1 != & !isdigit(csi+1) & !isoperator(csi+1) & !isseparator(csi+1) & !isoperator(csi+1)/如果后一个字符不是空格sb.append(csi);continue;elsesb.append(csi);if(iskeyword(sb)writefile(3, sb);sb = new stringbuilder();elsewritefile(1, sb);sb = new stringbuild

10、er();continue; else / 如果是数字if (isdigit(csi) if (isdigit(csi + 1) / 如果前后都是数字的话sb.append(csi);continue; else sb.append(csi);writefile(2, sb);sb = new stringbuilder();continue;/ 如果是界符if (isseparator(csi) sb.append(csi);writefile(4, sb);sb = new stringbuilder();continue;/ 如果是运算符if (isoperator(csi) if(is

11、operator(csi+1)sb.append(csi);continue; elsesb.append(csi);writefile(5, sb);sb = new stringbuilder();continue;/ 判断是否为数字public static boolean isdigit(char ch) boolean result = false;if (ch = 48) result = true;return result;/ 判断是否为字母public static boolean isletter(char ch) boolean result = false;if (ch

12、 = 65 & ch = 97 & ch = 122) result = true;return result;/ 判断是否为关键字public static boolean iskeyword(stringbuilder str) boolean result = false;string str1 = new string(str);for(int i = 0; i keywords.length; i+)if(keywordsi.endswith(str1)result = true;return result;/ 判断是否为运算符public static boolean isoper

13、ator(char ch) boolean result = false;for(int i = 0; i operators.length; i+)if(operatorsi = ch)result = true;return result;/ 判断是否为界符public static boolean isseparator(char ch) boolean result = false;for (int i = 0; i separators.length; i+) if (separatorsi = ch) result = true;return result;/ 按照二元式规则写入文件public static void writefile(string str1, stringbuilder number)throws ioexception string str = number + t + ( + str1 + , + number + );if (str1.endswith(1) str = str + t + t + 标识符;if (str1.endswith(2) str = str + t + t + 常数;if (str1.endswith(3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论