一、课程设计任务及要求

1.1、目的

通过使用一个通用的能够自动根据正规表达式生成词法分析程序的工具程序设计一个简单语言的词法分析器,使学生充分理解课程理论内容和工具软件的使用技巧,掌握所涉及的典型数据结构,算法及方法,为今后在大型软件系统实践中设计性能优良的软件系统打下基础。

1.2、任务与要求

【基本要求】

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输            出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)

【测试数据】

如源程序为C语言。输入如下一段:

1 main(){2

3 inta,b;4

5 a = 10;6

7 b = a + 20;8

9 }

测试数据

1 (2,”main”) (2,”a”)2

3 (5,”(“) (4,”=”)4

5 (5,”)“) (3,”10”)6

7 (5,”{“) (5,”;”)8

9 (1,”int”) (2,”b”)10

11 (2,”a”) (4,”=”)12

13 (5,”,”) (2,”a”)14

15 (2,”b”) (4,”+”)16

17 (5,”;”) (3,”20”)

二、需求分析

2.1、分析

通过修改代码使得自动机能够更多的实现运算符号的识别功能,使用TINY语言调试一个程序,加深同学对词法分析的认识以及理解。另外,同时增强编写和调试程序的能力。

2.2、问题解决

对读取的文件进行预处理,从头到尾进行扫描,去除//和/*  */的内容,以及一些无用的、影响程序执行的符号如换行符、回车符、制表符等。但是千万注意不要在这个时候去除空格,因为空格在词法分析中有用,比如说int i=3;这个语句,如果去除空格就变成了“inti=3”,这样就失去了程序的本意,因此不能在这个时候去除空格。

2.3、解决步骤

对源文件从头到尾进行扫描了,从头开始扫描,主控程序主要负责系统建立一个文件保存四个表,这四个表分别存储关键字、运算符、界符、过滤符。而标识符和常数则用正则表达式判断。建立了多个布尔类,当系统读取代码时,用空格或制表符作为标志符,当遇到空格就输出之前检索的字符串进行判断(规定每个单词符号之间都有空格),判断字符串时,系统会通过顺序查找依次调用布尔类与之匹配来判断其属性并输出,如没有匹配成功,则说明所检索的字符串不合法,系统则会输出非法字符串。直到最后一个字符串匹配完毕之后系统结束。

三、设计思路

3.1、总体思路分析

程序的关键点在于对给出一段程序中的各种单词的分离。在每段程序中,单词种类可以分为:关键字,分界符,算术运算符,关系运算符,标识符和常数。关键字的判断则是通过与已知数组中列出的元素进行对比,得出该单词是否为关键字;分解符,算术运算符,关系运算符的判断与接受到的字符进行比较,得出该字符是否为分解符,算术运算符或者为关系运算符。

状态图

图3-1-1:功能模块分解图

总控程序流程图:

图3-1-2:控制流程图

3.2、设计原理

主要任务如下:

识别出输入的源程序中的单词,输出二元组形式的单词序列。

删除无用的空白字符、回车符等没有实质意义的字符。

图3-2:正规式和状态转换图

实验步骤:

PL/0语言文法的EBNF表示如下:

1 ::=beginend2

3

4

5 ::={;}6

7 ::=

8

9

10

11 ::=ID:=

12

13

14

15 ::={+ | -}16

17

18

19 ::={* | /

20

21

22

23 ::=ID | NUM | ()

3.3实现方法

本次实验是设计词法分析器,其中核心函数是cifa(),分析的语言是PL/0,首先,采用循环遍历的方法读取用户输入的一段代码,跳过源程序中的空格字符,然后if语句配合switch语句对读入的代码挨个判断,最后以二元组的形式输出结果。

四、详细设计

4.1、项目设计步骤

a)创建存放识别程序文件

图4-1:待编译程序文件test.txt

b)读取文件单词并存储

读取文件test.txt文件:

1 br = new BufferedReader(new FileReader("tests.txt"));

存放构成单词符号的字符串:

1 public StringBuffer strToken = new StringBuffer();

基本保留字(关键字)

1 public String [] retainWord = new String[]{"int","if","else","return","main","void","while","break"};

c)识别不同程序单词

基本保留字

1 for(int i = 0;i < retainWord.length;i++){//是否为关键字,,是返回1

2 if(strToken.toString().equals(retainWord[i])){3

4 return 1;5

6 }7

8 }

1 if(code == 1){//关键字

2 System.out.println("('"+1+"','"+strToken+"')");3

4 }

标识符

1 for(int i = 0;i < retainWord.length;i++){//是否为关键字,,是返回1

2 if(strToken.toString().equals(retainWord[i])){3

4 return 1;5

6 }7

8 }9

10 if(strToken.length() != 0){11

12 ......13

14 }15

16 return 2;17

18 }19

20

21

22 else if(code == 2){//非数字,关键字

23 System.out.println("('"+2+"','"+strToken+"')");24

25 }26

27

28

29

30

31 常数32

33 if(strToken.charAt(0)>='0' && strToken.charAt(0)<='9'){//第一个是否为数字返回3

34 return 3;35

36 }37

38

39

40 else if(code == 3){//数字

41 System.out.println("('"+3+"','"+strToken+"')");42

43 }

运算符

1 else if(ch == 43){2 Retract();3

4 System.out.println("('"+4+"','"+(char) ch+"')");5

6

7

8 }else if(ch == 45){9 Retract();10

11 System.out.println("('"+4+"','"+(char) ch+"')");12

13

14

15 }else if(ch == 42){16 Retract();17

18 System.out.println("('"+4+"','"+(char) ch+"')");19

20

21

22 }else if(ch == 47){23 Retract();24

25 System.out.println("('"+4+"','"+(char) ch+"')");

分隔符

1 System.out.println("('"+5+"','"+(char) ch+"')");2 }else if((char) ch == '('){3

4 Retract();5

6 System.out.println("('"+5+"','"+(char) ch+"')");7 }else if((char) ch == ')'){8

9 Retract();10

11

12

13 System.out.println("('"+5+"','"+(char) ch+"')");14 }else if((char) ch == '{'){15

16 Retract();17

18

19

20 System.out.println("('"+5+"','"+(char) ch+"')");21 }else if((char) ch == '}'){22

23 Retract();24

25

26

27 System.out.println("('"+5+"','"+(char) ch+"')");28 }else if((char) ch == ','){

d)语言单词编码

表4-4:语言单词编码

五、运行调试与分析讨论

程序运行环境为Win10系统,在IDEA/ECLIPSE上运行

运行结果分析如下:

5.1、当在文本文件test.txt中输入文法:

图5-1-1:类型号和单词输出结果

5.2输出异常处理:

a)文件路径异常

图5-1-2:获取程序文件异常

b)程序中未识别单词异常

图5-1-3:不能识别程序单词报错

六、设计体会与小结

心得体会:

这个程序实现了课设的所有要求(由于我是31号做第一题词法分析模拟,但同时实现了扩展功能对于注释的文字进行忽视编译),虽然可能还存在些不足,像之前刘立月老师提出的我的程序对于简短的程序是完全可以的,我的读取方式是对象全部读取.但是对于一些比较大的项目来进行对象读取时间比较长.于是在我的程序当中进行了一定量的修改,更改成行的读取.用编译原理的知识自己独立完成这样一个程序我觉得还不错了,毕竟做这样的课设可以学到不少东西.

学习心得:

一开始对编写词法分析毫无头绪,不知如何下手。上网查资料是我们迈开的第一步,然后查阅相关资料,小组里相互讨论帮助,在多次的调试和改进中终于把程序完成了。通过这次的程序实验我对编译原理这门课程有了进一步的深层次了解,而且在自已动手体验的情况下,更加透彻地理解了词法分析的过程。在设计过程中,要发扬团体合作的精神,互帮互助,共同进步。善于发问,善于思考。

编译原理java课程设计_编译原理课程设计词法分析相关推荐

  1. 餐饮管理系统 mysql数据库设计分析_终稿课程设计_餐饮管理系统数据库设计.docOK版(样例3)...

    <课程设计_餐饮管理系统数据库设计.doc>由会员分享,可免费在线阅读全文,更多与<(终稿)课程设计_餐饮管理系统数据库设计.doc(OK版)>相关文档资源请在帮帮文库(www ...

  2. python贪吃蛇代码课程设计_c语言课程设计之贪吃蛇代码及思路 c语言课程设计报告之贪吃蛇...

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8846529.html 注:本文档需与c语言课程设计之贪吃蛇文档配套使用.c语言实现贪吃蛇代码可 ...

  3. ux设计_声音建议:设计UX声音的快速指南

    ux设计 Mating calls, warning grunts, and supportive coos are some of the sounds heard throughout the a ...

  4. 壁行式起重机设计_玉米播种机的设计_残疾人轮椅设计_破冰除雪机设计_单转子可逆式锤式破碎机设计_全液压升降机设计_振动压路机振动轮设计_旋转型灌装机设计_搬运机械手及其控制系统设计……

    组合机床主轴箱及夹具设计(论文+DWG图纸) 机械毕业设计-玉米播种机的设计(开题报告+任务书+说明书+CAD图纸+答辩PPT) 机械毕业设计-残疾人轮椅设计(含全套CAD图纸)    残疾人轮椅的设 ...

  5. 小型蘑菇定向切片机设计_鲜枣去核机的设计_玉米脱粒机的设计_振动式马铃薯收获机的设计_谷物干燥机的设计_锤片式饲料粉碎机的设计_山楂去核机的设计_萝卜切丝机设计_板栗去皮机设计_锤式破碎机设计……

    棉花打包机的设计[说明书(论文)+CAD+solidworks] 毕业设计_气动四自由度机械手结构设计(设计说明书+CAD图纸)    套类零件自动上下料机构 玉米脱粒机的设计(说明书+cad图纸+p ...

  6. 8位数控分频器的设计_数控分频器的设计

    数控分频器的设计 摘要: 此设计以 quartusII 为开发平台 , 用 VHDL 语言设计了数控分频器,并生成原理图 , 完成了分频的功能 , 并在 quartusII 上仿真 , 验证通过. 关 ...

  7. ux设计_为企业UX设计更好的数据表

    ux设计 重点 (Top highlight) If you have worked on enterprise products, you must have noticed the use of ...

  8. 网页框架布局设计_实用的网页设计-框架和框架用法介绍

    网页框架布局设计 Ah, frames. We hated them when Netscape first offered them up around 1995; we deplored them ...

  9. 计算机视觉课程教学大纲_综合布线工程课程教与学(教学大纲)

    77门课程教学大纲:Python/人工智能/大数据等 (点击,可以查看详细大纲内容) 课程教学大纲 学院: 工学部 系(部): 计算机应用工程系 课程名称: 综合布线工程 课程代号: b2012157 ...

  10. 蜗杆参数法设计_齿轮几何尺寸设计,很实用的Excel表格(附自动计算表格)

    各类齿轮自动计算校核表格获取见文章最下方 我们生活中最常见的齿轮有渐开线圆柱直齿轮.圆锥齿轮.涡轮蜗杆以及链轮类的设计计算,在进行设计时,我们都是对于尺寸进行设计计算,一般都是先要了解齿轮的模数,压力 ...

最新文章

  1. 顺序表应用3:元素位置互换之移位算法
  2. 工作的未来:敏捷人士瑞典大会上午议程回顾
  3. 001_汽车之家,新浪和360之间的交流
  4. 分析 Go time.After 引起内存暴增 OOM 问题
  5. 追本溯源 —— 汉语词汇含义的演化
  6. Windows EC2 Instance 忘记密码如何重置
  7. 活动目录的灾难恢复操作指导之三
  8. Oculus首席科学家发声,称VR需要能够“欺骗”大脑
  9. C语言线性表之单链表
  10. Eclipse 中部署应用到任意服务器
  11. oracle中ccuser,oracle数据库user profile设置方法
  12. java 位运算 hashcode_hashcode面试题
  13. SQL——连接查询、聚合函数、开窗函数、分组功能、联合查询、子查询
  14. 可以用树结构表达版本号
  15. 软件项目文档及其必要性
  16. oracle数据库生成流水号,oracle 中生成流水号 步骤
  17. mybatis日志在线生成sql(日志参数填充,sql日志格式化)
  18. vb6判断操作系统版本-从win95到win7
  19. SecureCRT键盘无法输入
  20. XXE漏洞(XML外部实体注入)

热门文章

  1. 哈工大计算机系统大作业 程序人生-Hello’s P2P 2022
  2. android8.1 修改系统默认语言为中文
  3. wampserver3.1.7_x64启动后橙色不变绿解决办法
  4. visual studio 2017 installer 安装包制作过程出现的问题---无法注册模块 HRESULT -2147024769 请与您的技术支持人员联系
  5. Spring Cloud RestTemplate报错:java.lang.IllegalStateException: No instances available for xxx
  6. Creator3D:3D模型优化-减面
  7. 1549页Android最新面试题含答案,android游戏开发
  8. pyhton 爬取 58同城 数据
  9. 巧用别名和 sh 脚本,adb 快速截图和录屏,提高你的效率
  10. Android 中截屏功能的实现