一、 实验目的

1. 通过实验对编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;

2. 掌握编译程序设计的基本方法和步骤;

3. 能够设计实现编译系统的重要环节词法分析,同时增强编写和调试程序的能力。

二、 实验要求

单词的分类

可将所有标识符归为一类;将常数归为另一类;保留字和分隔符则采取一词一类。

符号表的建立

可事先建立一保留字表,以备在识别保留字时进行查询。变量名表及常数表则在词法分析过程中建立。

单词串的输出形式

所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。

4.数据获取及存储

本设计中默认./src/output.txt读取源文件,运算结果存储./src/output.txt文件中

三、 单词分类表

注:具体及详细编码以com.nonefly.test.KeyTypes类中定义为准

1. 关键字表

关键字,java中共50个关键字,如下,对其按顺序一字一编码

"abstract", "boolean", "break", "byte","case", "catch", "char", "class", "continue", "default", "do","double", "else", "extends", "final", "finally", "float", "for","if", "implements", "import", "instanceof", "int", "interface","long", "native", "new", "package", "private", "protected","public", "return", "short", "static", "super", "switch","synchronized", "this", "throw","throws", "transient", "try","void","volatile","while","strictfp","enum","goto","const","assert"

助记符

种别编码

关键字

ABSTRACT

1

abstract

BOOLEAN

2

boolean

BREAK

3

break

BYTE

4

byte

CASE

5

case

...

...

...

ASSERT

50

assert

2. 运算符表

运算符,设计中涉及到+ - * / > = < & | ~十种,对于组合运算符如++ +=等未定义,将其分开描述。

运算符|助记符|种别编码

-----|------|---

| PLUS | 51

| MIN | 52

| MUL | 53

/ | DIV | 54

& | AND | 55

\ || OR | 56

~ | NOT | 57

> | GT | 58

= | EQ | 59

< | LT | 60

3. 分隔符表

界符(分隔符)涉及如下几种

, ; { } ( ) [ ] _ : . " \未一词一符定义,统一归为 SEPARATORS(助记符):61(单词种别)

4. 其他(标识符、常数、非法字符)

类型

种别编码

助记符

标识符

71

ID

常数

0

DIGIT

非法字符

-1

ERROR

四、单词状态图

五、 算法描述

程序中用到的函数列表:

函数名或变量

解释

TestLexer(String fileSrc)

通过路径构造词法分析器

StringBuffer buffer;

文件读入缓冲区

char ch;

字符变量,存放最新读进的源程序字符

String strToken;

字符数组,存放构成单词符号的字符串

boolean isLetter(char ch)

判断ch是否为字母

boolean isDigit(char ch)

判断是否为数字

boolean isKeyWord(String)

判断是否为关键字

boolean isOperator(char)

判断是否为运算符

boolean isSeparators(char)

判断是否为分隔符

void analyse()

分析程序(关键代码)

void getChar()

将下一字符读到ch中,搜索指示器前移一个字符

void getBC()

检查ch空白则调用getChar()至ch中进入非空白字符

void concat()

将ch连接到strToken之后

void retract()

将搜索指示器回调一个字符位置,将ch值为空白字

void writeFile(String,String)

按照二元式规则写入文件

int getType(String args)

利用反射获取种别编码

六、 程序结构

1. 整体目录结构如下,其中:

a.FileUtil.java 对文件的读写等操作

b.KeyTypes.java 定义了单词种类对应的种别编码

c.TestLexer.java 是分析器类,继承KeyTypes类,对源程序词法分析

d.TypeUtil.java 是一个简单的判断字符种类的类

e.MainTest.java 是测试主方法类,是程序入口,通过源程序路径创建TestLexer类,调用其中词法分析方法,最后结果保存在文件中

2. 上述类中定义方法如下,方法详细功能见(算法描述)中表格

七、 运行结果

1. 准备

在input.txt中输入源程序(我们以本程序源代码为例,此文件必须有),output.txt中为空,作为结果输出(可以不创建,运行时自动创建)如下图:

2. 运行

在文本中,按照要求,我们以(种类编码,VALUE)格式保存结果,在控制台中,为方便观察,以(助记符,VALUE)格式打印出。(运行结果如下)

八、 设计技巧及体会

这是学习编译原理时的第一次实验,回忆试验中的过程,虽然对编程语言的提升并没有太多,但是重要的是让我们了解编程语言在通往机器与之交流的一个重要环节。了解词法分析对源程序处理分类的思想。

在设计中,实现了简单的要求并加入了自己一些想法,最终程序也可以成功运行并能按要求对结果保存。当然,其中还有一些不足,其中一部分因为与大部分设计几乎一样,因此便"简写"。比如对分隔符种类处理,类似于操作符以及关键字处理,因此并没有一词一类,而是统一作为一类。还有对于注释的分析,因为"//"的注释没有想到很好的处理办法让忽视代码到行尾,因此将其当做普通分隔符处理。(后续中在得到老师帮助后已解决注释问题,对于//单行注释以及/* */多行注释都可以处理)

*对于注释处理测试如下

我们用main()方法所在类代码测试,其中两种注释类型都有包括*在输出结果中,显然已经忽略注释内容(如图中标记处),即使两种即使嵌套使用也可以正确处理

此次的实验收获还是很大的,除了上述,因为用java完成对java语言的分析,因此对这门编程语言在回顾熟悉的基础上又有了新的收获。而且尝试用了平时不用的方式,比如定义常量类,通过反射以字符串获取属性值,也许在使用中因不常用有所欠缺,但按所想完成功能感觉还是很好的~

九、源程序

词法分析器java_java词法分析器简单实现相关推荐

  1. 词法分析器java_Java代码到底是如何编译成机器指令的。

    原文地址:https://mp.weixin.qq.com/s/XH-JajAne0O7_yCYE5wBbg 作者:Hollis 在<Java代码的编译与反编译>中,有过关于Java语言的 ...

  2. 编译原理之词法分析器随笔和简单实现

    借鉴:   编译原理之美. 极客时间上 什么是词法分析 编译原理:词法分析简单的来说就是在字符串中提取一系列的word单词. 编译器的眼里, 我们的一切输入都是什么? 都是一个一个的字符串. 所以编译 ...

  3. c语言词法分析器实验原理,词法分析器的设计与实现 编译原理实验报告.doc

    词法分析器的设计与实现 编译原理实验报告 中北大学软件学院 实 验 报 告 专 业 软件工程 课程名称 编译原理 学 号 姓 名 辅导教师 张静 成绩 实验日期2015.5.19实验时间14:00~1 ...

  4. indexof java_java indexOf()简单字符查找实例

    java indexof()简单字符查找实例 int indexof(string ch); 就是查找字符/字符串ch在index以后的位置,如果没有找到返回-1;index可以有可以没有,没有时默认 ...

  5. 手写java_JAVA实现简单手写识别

    作为一个机器学习的初学者,首先肯定是要有点自己的对机器学习的看法的. 我认为的机器学习(在我目前接触到的知识来说.!!(大佬勿喷)),机器学习专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识 ...

  6. 简单计算器的实现java_java实现简单计算器

    1.概述 之前作者写过一篇文章,也是关于计算器的,用的是C++与Qt,链接在这里 这次用java的swing写的(这差距好像有点大,好吧是qt太强了). 先上图: 2.UI 总体布局使用流布局. (1 ...

  7. 斗地主比大小 java_java实现简单斗地主(看牌排序)

    本文实例为大家分享了java实现简单斗地主的具体代码,供大家参考,具体内容如下 第一种方法 /** * @param args */ /** * 项目编码格式: * 1.GBK:只支持简体中文 * 2 ...

  8. 3 编写程序打印下面的图案 java_Java编程简单应用———1、HelloWorld(HelloWorld的来源);2、输出个人信息3、输出特殊图案...

    在搭建完成Java的开发环境之后很多小伙伴肯定想跃跃欲试,开发自己的第一个Java程序出来. 这里牛哥提供了三个简单Java小程序,小伙伴可以按照牛哥提供的这四个小程序来享受一下Java编程带给你的快 ...

  9. 信号量 java_java 信号量简单分析

    1. 先看几个semaphore的写法,可以看到semaphore的acquire和release都是和wait和notify相关的 //设置最大信号量 public classSemaphoreMa ...

  10. htmlparser的使用java_java htmlparser 简单使用入门

    下面对htmlparser 简单介绍下,信息来自百度 htmlparser [1] 是一个纯的 java写的 html( 标准通用标记语言下的一个应用)解析的库,它不依赖于其它的java库文件,主要用 ...

最新文章

  1. 获取文件名和路径函数
  2. gitlab 安装报错:Could not find modernizr-2.6.2 in any of the sources
  3. 如何清理镜子上的水渍:亲测有效
  4. 会话跟踪技术之HttpSession
  5. PowerDesigner(四)-业务处理模型
  6. CVE-2017-4901 VMware虚拟机逃逸漏洞分析【Frida Windows实例】
  7. 基于相关向量机RVM的分类算法
  8. 敏捷开发框架_测试经理必知必会:敏捷开发3355原则
  9. android dff播放器,无损音乐文件的整理(dff、dsf篇)
  10. 红帽子linux装mysql_红帽学习之Linux安装
  11. gitlab设置项目组成员权限
  12. Js~Boxy中的复杂弹出框
  13. 计算机换色带技巧,打印机色带维护技巧
  14. Java 阴阳历转换
  15. 视觉SLAM和激光SLAM的实现
  16. Html5之canvas重叠矩形、getContext、fillStyle、fillRect
  17. pytorch实现straight-through estimator(STE)
  18. 关于感冒和流感的一些记录
  19. 蓄电池浮充电和均充电
  20. Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET

热门文章

  1. TortoiseSVN的安装和汉化包
  2. [ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)...
  3. 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
  4. ftp 可以连接 feat 接收服务器响应时超时,[软件工具]CUTFTP上传出现:接收服务器响应时发生超时(60000 毫秒),建立数据 socket 失...
  5. 移动端屏幕宽度自适应原理及实现
  6. 独家 | 盘点大数据标准化政策、组织及进展(附PPT下载)
  7. android各版本源码下载
  8. GridView commandname
  9. adb 驱动 fastboot 驱动 win10
  10. 超实用的桌面收纳盒!