1、目的

设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。

2、实现功能:词法分析

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。其中,

syn为单词种别码。

Token为存放的单词自身字符串。

Sum为整型常量。

具体实现时,可以将单词的二元组用结构进行处理。

3、待分析的C语言子集的词法(可以自行扩充,也可以按照C语言的词法定义)

1)关键字

main  if  then  while  do  static  int  double  struct  break  else  long  switch  case  typedef  char  return  const  float  short  continue  for  void  default  sizeof  do

所有的关键字都是小写。

2)运算符和界符

+  -  *  /  : := <  <>  <=  >  >=  =  ; (  )  #

3)其他标记ID和NUM

通过以下正规式定义其他标记:

ID→letter(letter|digit)*

NUM→digit digit*

letter→a|…|z|A|…|Z

digit→0|…|9…

4)空格由空白、制表符和换行符组成

空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。

4、各种单词符号对应的种别码

表1   各种单词符号的种别码

单词符号   种别码       单词符号   种别码      

main       1                  ;             41

if             2                  (             42

then        3                  )             43

while       4               int              7

do           5               double       8

static       6               struct         9

ID           25              break        10

NUM      26              else           11

+            27               long          12

-             28              switch        13

*             29             case           14

/             30              typedef      15

:             31              char           16

:=           32              return         17

<            33             const           18

<>          34             float             19

<=          35             short            20

>            36             continue      21

>=          37             for               22

=            38             void             23

default   39             sizeof           24

#            0

5、此法分析程序主要思想:采用模块设计

算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。算法执行流程图如下:

1、关键字表初值

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:

char *rwtab[27]={“main”,”if”,”then”,”while”,”do”,” static”,”int”,” double”,”struct”,”break”,”else”,”long”,”switch”,”case”,”typedef”,”char”,”return”,”const”,”float”,”short”,”continue”,”for”,”void”,”default”,”sizeof”,”do”};

(2) 程序中需要用到的主要变量:syn,token和sum。

2、 扫描子程序的算法思想

首先设置三个变量:token用来存放构成单词符号的字符串;sum用来存放整型单词;syn用来存放单词符号的种别编码。扫描子程序主要部分流程如图所示。

3、设计步骤

(1)首先把一个源程序代码分为五类单词符号:关键字、分隔符(界符)、标识符、数字常量和汉字。

(2)设计程序,把关键字和界符存到一个二维数组里,每次取出一个单词,然后判断是哪一类符号,并写入文件。在设计程序之前,我们得把待分析代码写入一个文本文件,然后在读到内存存到一个数组里。对该数组进行分析

(3)对不符合标识符定义的,也写入文件。

流程图如下:

存放关键字表:

存放运算符表(在分析之前直接将其赋值):

主要函数模块:具体函数代码不再展示

其中主函数如下:

完整源码文件:访问我的百度网盘

http://链接:https://pan.baidu.com/s/1aGcXKAcfI5uOqCWCdTBEFA?pwd=8080 提取码:8080

测试代码:

(1)、

(2)、

(3)、

(4)、

其中code1.txt测试没有复杂的隔离符和汉字,  主要测试预处理程序

code2.txt测试没有复杂的隔离符但有汉字  测试对汉字的处理

code3.txt测试有复杂的隔离符且有汉字     测试复杂的隔离符

(前面三项都是测试整形的数据)

code4.txt测试代码中含有浮点型数据。

运行结果:由于输出项比较多,只截取部分图

(1)、

(2)、

(3)、

(4)、

6、遇到的问题及解决过程

(1)字符分类问题:因为实验要求给的界符并不多,我自己添加了更多的界符,界符存储问题,开始是想用一个一维数组来存储,但是像“+=”这样的界符是得用两个字符来存储的。故最后选用二维数组存储界符。关键字也是选用二维数组来存储,在这里存储界符和关键字的时候为了和它的种别码对应起来,采用哈希存储思想,就是它的下标就是它的种别码。最后将字符分为4类,另外由于实验要求没有对库函数的处理,我在此给它处理为标识符。

(2)汉字问题:实验要求没有说对汉字的处理,这里我作了处理,但是对连续的汉字进行处理。开始由于编译器采用UTF-8(BOM)编码方式,这个是没什么问题的,但是写入文件却是乱码,我又把编译器编码方式改为GBK,但是还是乱码,最后通过我一步一步试探,返现是待分析程序的文本文件的编码方式不对,不能是UTF-8,然后我把该文本文件的编码由UTF-8改为ANSI。这样就解决了汉字问题。一开始我是没有考虑汉字问题的,但是后面我一但考虑汉字以后,对我的字母和数字判断产生了不小副作用,但是通过我一步步调试,这个过程非常麻烦而且浪费时间,不过最终我还是解决了汉字问题。

(3)预处理问题:总的来说,这个过程问题不是很大,我所遇到的问题就是考虑不全,在去掉注释的时候只考虑了“//”,而没有考虑”/*……*/这种注释,后面又做了修改。

(4)文件处理问题:这个就是C语言的一些处理文件函数忘记了,通过简单的复习,然后再经过运用,这个其实不算什么难问题。就是知识储备问题。

(5)浮点数和正负数识别问题,一开始写的时候只识别了整数,而且不包括正负数。这个看似简单的问题,在修改的时候却是相当的麻烦,比如那个“+”号,它可以处理为运算符,但是又可以认为是属于正数的一部分。不过最后经过反复调试和修改也总算解决了。

心得:

编译原理这门课本来就是一门非常抽象的课程,而且比较难,第一部分是词法分析。虽然用文字描述起来就几句话的事,但是编程实现真的是一个复杂的事情。这也让我深刻了解到高级语言到低级语言转化的复杂性,光词法分析这个阶段就很复杂,那中间代码产生那些,还与具体的计算机指令集,寄存器,内存分配什么的都有关系,看来会写编译程序的程序员的水平是真的高。这次试验我花费最多的时间就是调试部分了,因为程序经不起测试,每当换一个新的代码测试,就会暴露出问题,而且改了以后可能又会对之前测试的代码又有影响。总的说来就是程序总的设计阶段没做好,在做之前就得把大多数可能想好。不然中途心血来潮突然来一个别的问题没考虑到,再修改就是一件非常麻烦的事情。在调试过程中,我对调试技巧有了一定的提升,并且对编译原理这门课的重要性有了一个更深的认识。再后面的两次实验中,继续实验,争取写出一个健壮性好的程序。

编译原理———词法分析器相关推荐

  1. 【SEUSE】编译原理 - 词法分析器实验报告

    [SEU&SE]编译原理 - 词法分析器实验报告 README 一. 实验目的 二. 实验环境 1. 开发环境: 2. 运行环境 三. 实验内容 1. 主要内容 2. 主要功能 3. 种别码 ...

  2. 编译原理——词法分析器

    采用java图形化界面编写了java语言的词法分析器,该分析器可识别所有java关键字.软件工程课程中编译原理实验. Keyword.jvav package org.kyc.test1;public ...

  3. 编译原理--词法分析器(python语言实现)

    词法分析器 最近在学习编译原理.由于实验要求有词法分析器,这里我就先记录一下词法分析器实现过程以及具体思路. 目标语言 此处我选择的目标语言是c语言的子集来进行词法分析. 实现语言 此处我选用的语言是 ...

  4. 编译原理词法分析器的c++实现

    一.题目的理解和说明 编译原理这门课是计算机专业的核心课程之一,是一门研究软件是什么,为什么可以运行,以及怎么运行的学科.编译系统的改进将会直接对其上层的应用程序的执行效率,执行原理产生深刻的影响.编 ...

  5. 南华大学编译原理----词法分析器的设计与实现、语法分析器的设计与实现

    下载链接:(各位同学不需要充钱哈,这种我也没有收益,去淘宝上面找个代下,大概0.5元就能下载实验报告,用来给同学们参考,下载积分不是我设置的,是网站自己默认的) ------------------- ...

  6. 编译原理——词法分析器的设计

    两种设计方案以及各自优缺点 我们先学手工构造 词法分析器手工构造 关系运算符的手工构造: 上面这个图其实我有点疑惑,下面说一下,我自己的理解 C语言中的关系运算符,有<. <=. > ...

  7. 编译原理—词法分析器(Java)

    1.当运行程序时,程序会读取项目下的program.txt文件 2. 程序将会逐行读取program.txt中的源程序,进行词法分析,并将分析的结果输出. 3. 如果发现错误,程序将会中止读取文件进行 ...

  8. 编译原理-词法分析器

    词法分析器 实验要求 1.根据以下的正规式,编制正规文法,画出状态图: 标识符 <字母>(<字母>|<数字字符>)* 十进制整数 0 | ((1|2|3|4|5|6 ...

  9. 编译原理词法分析器(C/C++)

    前言&思路 词法分析器不用多说,一开始我还不知道是什么样的,看了下别人的博客,再看看书,原来是输出二元组,这不就是字符串操作嘛.然后细看几篇博客,发现大都是用暴力判断来写的.我对代码重复性比较 ...

最新文章

  1. 制作OS X El CAPITAN安装U盘
  2. UF_DRAW_set_view_display 使用问题
  3. C++学习笔记13-类继承
  4. 秒懂边缘云 | 边缘云技术进阶
  5. SpringBoot_入门-课程简介
  6. Django-model进阶
  7. 两步验证杀手锏:Java 接入 Google 身份验证器实战
  8. php中函数的默认值,参数的顺序
  9. 现在学html4,HTML学习心得(4)
  10. MySQL数据库知识点总结
  11. 超级计算机预报威海雨雪,威海历史天气预报查询_2018年12月份威海天气记录_威海2018年12月份天气情况_天气后报...
  12. [转]Ogre:Hardwarebuffer
  13. 一文读懂二级分销返利模式,商城系统源码机制分享
  14. 2018腾讯社交广告算法大赛总结/0.772229/Rank11-复习代码
  15. 钓鱼指北 Gophish钓鱼平台和邮件服务器搭建
  16. python实现图片rgb通道分离
  17. Luckily general gradient for spherical harmonics is defined
  18. H.265的各种帧(详解):接入图像
  19. 统计中的“不相关”与“线性无关”
  20. c语言打印顺时针循环方阵,顺时针打印矩阵(C语言代码)

热门文章

  1. 隐马尔可夫模型(Baum Welch算法与Viterbi算法)
  2. Java进阶(四)多态
  3. SOLIDWORKS怎样做填充阵列
  4. C语言里栈和堆的区别整理
  5. 误检率、查准率、查全率、漏检率计算公式
  6. 转: Windows句柄数的限制
  7. eclipse如何attach source?
  8. 韩国李世龙19岁当爹 与洪瑛琦姐弟恋开花结果
  9. C语言中如何定义全局变量
  10. 使用kali对同一局域网内的设备进行断网和查看设备图片