实验二 编译 词法分析器的构造

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二词法分析器的构造

一、实验目的

掌握词法分析器的构造原理,掌握手工编程或LEX编程方法之一。

二、实验内容

编写一个词法分析器,能够将输入的源程序转换为单词序列输出。

三、实验指南

1.源语言定义见教材附录A.1,其中的终结符即词法分析需要得到的tokens。

(1)该语言的关键字:if while do break real true false int char bool float (其中,int、char、bool、float在产生式中为basic)

所有的关键字都是保留字,并且必须是小写。

(2)id和num的正则表达式定义;

(3)专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */

(4)空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开I D、N U M关键字。

(5)考虑注释。注释由/*和*/包含。注释可以放在任何空白出现的位置,且可以超过一行。注释不能嵌套。

2.实现词法分析器的注意要点:

(1)关键字和标识符名的区别;

(2)数字的转换处理;

(3)“>=”和“>”这类单词的处理;

3.源程序测试示例

要求应自行准备多个源程序片段,运行并测试输出是否合符要求。

示例1:

源程序输入:

{

int i;

if ( i >= 0) i = i + 1;

}

输出token序列如下:

{,

int,

(id, i)

;,

if,

(,

(id, i)

>=,

(num, 0)

(id, i)

=,

(id, i)

+,

(num, 1)

示例2:

源程序片段:

{

int i; int j; float v; float x; float[100] a;

while ( true) {

do i = i + 1; while ( a[i] < v);

do j = j - 1; while ( a[j] > v);

if ( i >= j ) break;

x = a[i]; a[i] = a[j]; a[j] = x;

}

}

四、实验结果

五、实验小结

本次实验相对而言比较简单,最大的难点是不熟悉LEX程序的编写规则。在编写过程中,一度对括号以及注释的处理出错,后来发现是忘了将括号用引号引起来,使得其语法规则错误。关于注释的处理,后来查看了书本,知道了对* ?/ +等运算符字符表示它们自身的方法才得以解决。编写过程中也因为一些低级错误而浪费了一点时间,主要还是因为程序编写太少的原因。在对number和id 的定义以及main函数的书写大多是参考书本以及ppt的,在一定程度上降低了难度。

相关文档
最新文档