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

这篇具有很好参考价值的文章主要介绍了编译原理———词法分析器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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、此法分析程序主要思想:采用模块设计

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

词法分析器,c++,数据结构,算法

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用来存放单词符号的种别编码。扫描子程序主要部分流程如图所示。

词法分析器,c++,数据结构,算法

3、设计步骤

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

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

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

流程图如下:

词法分析器,c++,数据结构,算法

存放关键字表:

词法分析器,c++,数据结构,算法

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

词法分析器,c++,数据结构,算法

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

词法分析器,c++,数据结构,算法

其中主函数如下:

词法分析器,c++,数据结构,算法

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

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

测试代码:

(1)、

词法分析器,c++,数据结构,算法

(2)、

词法分析器,c++,数据结构,算法

(3)、

词法分析器,c++,数据结构,算法

(4)、

词法分析器,c++,数据结构,算法

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

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

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

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

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

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

(1)、

词法分析器,c++,数据结构,算法

(2)、

词法分析器,c++,数据结构,算法

(3)、

词法分析器,c++,数据结构,算法

(4)、

词法分析器,c++,数据结构,算法

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

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

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

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

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

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

心得:

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

到了这里,关于编译原理———词法分析器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 词法分析器(c++)

    个人觉得单纯是用来完成实验报告的话还行,但仅做参考,因为本人的编程水平有限,怕误人子弟。 本次代码支持以下操作: 单行注释 多行注释 文件形式输入 种别码可以在文件中自由修改 单词字符串识别支持: 部分(可手动在程序外部---reference.txt文件添加,),

    2024年02月04日
    浏览(45)
  • 词法分析器的设计与实现

    1.1、实验目的         加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 1.2、实验要求         1)对单词的构词规则有明确的定义;      

    2024年02月13日
    浏览(47)
  • Lex 生成一个词法分析器

     lex 通过输入一个.l 文件生成一个lex.yy.c 文件,然后通过c 编译器编译成一个可执行的词法分析器。 该词法分析器扫描输入源文件,生成一个token 符号流给后面语法分析器使用。   .l 文件的结构, 分成三个部分,声明, 转换规则, 自定义规则。 三个部分由%%分割 声明段,

    2024年02月19日
    浏览(46)
  • 编译原理-6-LR语法分析器

    自顶向下的、不断归约的、基于句柄识别自动机的、适用于LR(∗) 文法的、LR(∗) 语法分析器 只考虑无二义性的文法 自底向上 构建语法分析树 根节点 是文法的起始符号 S S S 每个中间 非终结符节点 表示 使用它的某条产生式进行归约 叶节点 是词法单元$w$$ 仅包含终结符号与

    2024年02月05日
    浏览(45)
  • 编译原理实验三:预测分析法语法分析器的设计

    ​ 根据文法编制预测分析法语法分析程序,以便对输入的符号串进行语法分析。通过编写预测分析法语法分析程序掌握预测分析法的基本原理、FIRST和FOLLOW集的计算、预测分析表的构造方法以及语法分析法主控程序的设计。 对于给定的上下文无关文法,编程完成以下功能:

    2024年02月05日
    浏览(52)
  • 编译原理——语法分析器(C/C++代码实现)

    编写一个简单的LL(1)语法分析器。(注意:此实验是简化版的LL(1)文法,已给出预测分析表,不需要求FIRST和FOLLOW集,直接根据预测分析表编写程序即可) 根据编译原理理论课中学习的算术表达式文法,以及该文法LL(1)分析表,用C语言编写接受算术表达式为输入的语法

    2023年04月26日
    浏览(38)
  • 编译原理语法分析器(C/C++)(LR1文法)

            来写语法分析器了,有可能是老师不一样也有可能是学校不一样,我要做的语法分析器复杂一点,额,现在想来也不复杂(可能)。         这一次的实验是要进行语法分析,是要用LL1或者递归下降分析法或LR分析法(LR0、LR1)设计语法分析程序。这次我也是先去百

    2024年02月07日
    浏览(32)
  • 编译原理——SLR(1)语法分析器(C/C++代码实现)

    设计、编制、实现并调试SLR(1)语法分析器,加深对语法分析的理解。 根据编译原理理论课中学习的算术表达式文法以及该文法的LR分析表,用C语言编写接受算术表达式为输入的语法分析器,以控制台(或文本文件,也可以结合词法分析器完成)为输入,控制台(或文件)

    2024年02月11日
    浏览(39)
  • 分析器:常见问题

    源生成器(增量生成器)由于它特殊的定位,关于它的调试十分困难。在这里分享一些调试它的经验。 另外经常有写类库,然后提供可以生成代码的Attribute给用户的需求,此时需要用到传递引用的知识点。 源生成器项目和普通的项目不同。 普通的会在你按下运行或调试后才

    2024年02月01日
    浏览(64)
  • Elasticsearch 查询分析器简介

    Elasticsearch 是一个开源的分布式搜索和分析引擎,它提供了强大的查询和分析功能。它基于 Apache Lucene 构建,支持大规模数据的实时搜索,并具有高可用性和可扩展性。 在 Elasticsearch 中,查询分析器负责处理用户搜索的输入,将文本进行分词并生成倒排索引。分析器在搜索过

    2024年02月17日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包