词法分析实验报告442

更新时间:2023-12-06 06:13:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一次实验报告

一、实验题目

词法分析;

二、实验目的

熟悉并实现一个简单的扫描器;

三、实验内容

1、设计扫描器的自动机;

2、设计翻译、生成Token的算法; 3、编写代码并上机调试运行通过。

四、概要设计

我们将按照词法分析的任务和作为一个独立子程序的要求来考虑词法分析器的设计。

1、输入,预处理

词法分析器工作的第一步是输入源程序文本。输入串一般是放在一个缓冲区中,这个缓冲区称为输入缓冲区。词法分析的工作可以直接在这个缓冲区中进行。但是大多数情况下,还是把输入串预处理一下,对单词符号的识别工作是比较方便的。因为对于许多程序来讲,空白符,跳格符,回车符和换行符等编辑性字符除了出现在文字常数中之外,在别处的出现都没有意义,而注解部分几乎允许出现在程序中的任何地方。它们不是程序的必要组成部分;它们存在的意义仅仅在于改善程序的易读性和易理解性。对于他们,预处理时就可以将其剔掉。

我们可以设想构造一个预处理子程序,它能够完成上面所述的任务。每当词法分析器调用他的时候,它就处理出一串确定长度的输入字符,并将其装入词法分析器所指定的缓冲区中。这样,分析器就可以在此缓冲区中直接进行单词符号的识别,而不必看管其他烦琐事务。 2、单词符号的识别

主要从以下几个方面进行分析:

①关键字的识别

多数语言的关键字是提前规定好的,所以我们可以预先建立一个关键字表,方便我们的处理。 ②标识符的识别

多数语言的标识符是“字母/数字”串,而且在程序中标识符的出现都后跟着算符或界符。 ③常数的识别

对这种单词的识别有赖于理解词头的词义。 ④算符和界符的识别

算符和界符也是能够提前就确定好,建立一张表来进行查看。

3、状态转换图

使用状态转换图是设计词法分析程序的一种好途径。转换图是一张有限方向图。在状态转换图中,结点代表状态,用圆圈表示。状态之间用箭弧连结。箭弧上的标记字符代表射出的节点状态下可能出现的输入字符或字符类。一个状态转换图可以用于识别一定的字符串。

例如识别标识符的转换图,如下所示: 0 字母 1 其它 2 字母或数字 其中0为初态,2为终态。这个转换图识别标识符的过程是:从初态0开始,若在状态0之下输入字符为字母或者数字,则读进它,并进入1状态。一直重复这个过程,直到状态1发现输入的字符不是数字或字母就进入2状态。状态2是终态,它意味着到此已识别出一个标识符。

注意:一个程序语言的所有的单词符号的识别也可以用若干张状态转化图予以描述。

4、状态转换图的实现

状态转化图很容易用程序实现。最简单的办法是让每个状态结点对应一段小程序。通过引进一组全局变量和函数,我们将它们作为实现转换图的基本成分。这些变量和函数是:

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

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

③GetChar() 子函数,将下一输入字符读到ch中,指针指向下一字符的位置 ④GetBC() 子函数,检查ch中的字符是否为空白。若是,则调用GetChar函数更新ch

⑤IsLetter()和IsDigit() 布尔函数,分别用于判断ch中的字符是字母还是数字 ⑥InsertId() 将标识符插入到对应的符号表中

另外,对于含回路的状态结点来说,可以让他们对应一个由WHILE语句和IF语句构成的程序段。

五、源程序(包含注释) 六、测试数据及运行结果

1、测试数据存放在一个TXT文件中,内容如下:

int main(){

int a=1,b=2,c; char ch1[100]=\

char x,y=\ c=a+b; x=y;

return 0; }

2、运行结果如下:

本文来源:https://www.bwwdw.com/article/vwrt.html

Top