编译原理实验报告

更新时间:2024-05-24 12:50:01 阅读量: 综合文库 文档下载

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

编译原理实验报告

课程名:编译原理实验

任课教师:葛林

姓名:甘言海

学号:020332010027

院系:信息科学与工程学院

专业年级:2010级计算机信息保密

实验一

Cygwin环境的熟悉和lex的使用1

一、 实验目的

熟悉cygwin环境的使用,学习使用lex写简单的词法分析程序,会在cygwin环境下使用flex调试lex写的程序。

二、 实验内容

读懂exam1.l和exam2.l两个例子,使用cygwin下的flex工具将exam1.l和exam2.l编译并调试通过。并且修改exam2.l,在其基础上增加如下记号:

? 左右大小括号:{ } ( )

? 将关系算符改写成C中的形式 ? 分号、赋值号:; = ? 关键字:if else

? 双斜线表示的注释:// ? 算术运算符号:+ - * /

? 将标识符改为可含有下划线,并且可以以下划线开头 ? 将注释内容忽略

三、 实验结果与心得

1. 了解和掌握了flex词法分析器生成工具的使用,lex的语法规则和组织方

式。熟悉了cygwin环境的使用,并能在cygwin下使用flex调试lex程序,利用gcc编译生成的lex.yy.c文件。 2. 在lex定义段使用递归方式的正规定义,简洁有效。

3. 状态的定义和使用,有时候通过状态可有效的解决一些复杂问题,比如

对注释的操作等。不同的状态之间可以使用“BEGIN”进行切换,在不同的状态中对同一正规式表示的句子可以执行不同的动作。 4. 有时候动作可以是一个空语句,这时候相当于过滤掉某些输入。 5. 动作中有返回语句时,返回值应当事先在定义段的第一部分用C语言的

语法进行定义,以便于后面的操作和使用。 6. 在词法规则段,lex总是尽可能匹配较长的句子。当发生冲突时,在词法

规则段中首先出现的正规式将被匹配。 7. 掌握了一些具体的lex元字符的使用方法,可以简化正规定义。 8. 当想要将元字符作为正文字符使用时,可以使用转义字符\\或””。 9. 熟悉了yyin、yyout、yyleng、yytext、yylex()、yywrap()等常用变量和函数

的具体意义和使用方法。

10. 理解了用C语言写的辅助函数对于词法分析的重要作用。这些辅助函数

一方面可以作为语义动作的一部分,另一方面可以为词法分析提供依据。而且可以将main函数作为辅助函数放在这里,当单独使用词法分析器的时候可以在main函数里实现对词法分析器的调度和使用。

实验二

Cygwin环境的熟悉和lex的使用2

一、 实验目的

熟悉cygwin环境的使用,学习使用lex写简单的词法分析程序,会在cygwin环境下使用flex调试lex写的程序。

二、 实验内容

在实验1所改写的程序的基础上增加string记号。string是字符串,如果”出现在字符串中,则必须转义,写成\\”形式;如果\\出现在字符串中,也必须转义,写成\\\\形式。

三、 实验结果与心得

1. 由于字符串以”开始,以”结束,且中间可以包含转义字符\\”,所以不能

简单的将两个引号之间的部分识别为字符串,因为最后一个引号可能是\\”的形式,这将构成一个词法错误。所以有必要设置一个状态用以标志一个字符串即将产生。 2. 由于字符串中不允许含有换行、\\和”,但是可以含有\\\\和\\”,所以可以用

一个正规式来标志\\\\和\\”,比如 example (\\\\\\\\)|(\\\\\\”)。然后再定义一个能匹配除换行、\\和”之外的所有可打印字符的正规式,定义字符串为这两种句子混合组成的所有句子。空格、制表符以及其他转义字符都可放入example的定义中,也可专门用一个正规式来匹配他们,并把该正规式纳入字符串的定义中。 3. 当输入遇到一个”时就进入字符串状态,再遇到一个单独的”就重新进入

初始状态。如果分析器一直处于字符串状态直至输入结束,调用yywrap()返回1,词法分析结束,这时候其实是输入出现了错误。为了检测出这个错误应当在字符串返回的时候检查输入的下一个字符是不是”,如果不是就说明输入出现了词法错误,进行相应的错误处理。对于串中出现了\\或换行的情况,这种方法同样能够检测到词法错误。 4. 如果要求在扫描输入的时候把字符串中的转义字符转变为实际意义,则

需要分开扫描,在分析器进入字符串状态后用不同的正规式来匹配普通字符构成的串和转义字符,并把转义字符转义成其实际代表的字符。这时候由于涉及到字符串操作,需要设置缓存区并用作全局变量。 5. 对于空字符串如果想要产生一个返回值,则需要特殊处理。因为进入字

符串状态后,接着识别一个”就重新返回初始状态。可以设置正规式\\”\\”用来专门识别空字符串,然后在动作中返回一个值用以标志这是一个空字符串。

实验三

词法分析的各类用途1

一、 实验目的

通过实验使学生明白词法分析的作用不仅仅在于写词法分析器,它还有很多其他用途。

二、 实验内容

写一个lex程序,它读入一个文件,将该文件中的所有的单独或连续的一段空白(包括一个或多个空格、制表、换行组成的空白)都替换成一个空格。

三、 实验结果与心得

1. 回顾和熟练了文件的简单操作。

2. 词法分析不仅仅能够用来写词法分析器,而且可以实现输入文件的格式

转换,字符串替换等其他操作。

3. 对空白的识别较为简单,设置一个正规式即可。

4. 每次识别一串空白后就将一个空格写入输出文件,识别到其他内容就原

样写入输出文件,因此应有能够区分空白和其他字符串的正规式,以下是其正规定义:

delim ws

[ \\t \\n]

normal[^ \\t \\n]+

{delim}+

5. 实验结果,输出文件将输入文件中所有的空白串都替换为了一个空格,

其他内容未作修改。

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

Top