实验二 编译 词法分析器的构造
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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的,在一定程度上降低了难度。