一个词法分析器的简单实现

词法分析器是编译器的前端,作用是将源代码的字符串分解成具有独立意义的最小单位,也就是计算机所认识的单词。这篇文章中,通过一个实验报告来明确这个词法分析器的需求,然后带大家通过代码的方式来实现一个简单的词法分析器(另一个方法是通过flex自动生成词法分析器)。

一、实验目的:

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

二、实验内容

编制一个单词获取程序,从文件输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、整数、小数、字符串、分隔符、运算符等七大类。并依次输出各个单词的内部编码及单词符号自身文本串(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。

注意:单词类型大小写不敏感(即不区分大小写

三、实验要求

1、词法规则

  1. 关键字: program、const、var、integer、decimal、string、procedure、begin、end 、if、then、else、while、do、call、read、write、not
  2. 标识符: 字母或“_”打头的由字母、数字串或“_”组成的任意长度的符号串。
  3. 整数: 数字串。
  4. 小数: 数字串·数字串
  5. 字符串: 由一对“”括起来的任意长度的符号串。注意:可以多行。
  6. 分隔符: {、}、(、)、;、空格
  7. 运算符: :=、=、<、<=、>、>=、+、-、*、/

2、设计词法分析函数getToken( ),完成以下功能:

  1. getToken( )每调用一次就分析出一个单词;
  2. 返回单词类别、单词自身文本串、单词在源文件中的行列号;

3、编写测试程序,反复调用函数getToken ( ),输出单词信息。

IMG_20150331_222331.304

我的实现思路是:

  1. 先将源程序代码全部读入缓冲区中。这一步可以有三种方法:一个一个字符读,一行一行读,全部读入。其中,1的代码可读性有点差,所以这里不采用。按行读实现起来是最难的,因为要处理换行的字符串问题。全部读入之后,只通过词判断,并没有换行的区别,只要识别出一个单词,就重新开始,识别出下一个单词。
  2. 调用getToken()从缓冲区的第一个字符开始,按照上图的状态转换图往后读,直到分析出一个单词;
  3. 输出这个单词的判定类别,返回,继续读取一个字符。

源代码如下:

参考:一条鱼、尹雁铃(更详细的词法分析器讲解)

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注