编译原理实验报告
Compilers Principles Experiment Report
学
班
姓
学
院:信息科学与工程学院(软件学院)
级:
名:xxx
号:
指导教师:
教 务 处
2020 年 9 月
目 录
实验 1 词法分析 .............................................................................................................................................3
1.1 实验目的 .......................................................................................................................................................3
1.2 实验任务 .......................................................................................................................................................3
1.3 实验内容.......................................................................................................................................................3
1.3.1 实验要求...............................................................................................................................................3
1.3.2 输入格式...............................................................................................................................................3
1.3.3 输出格式...............................................................................................................................................3
1.3.4 算法描述................................................................................................................................................3
1.3.5 程序源码................................................................................................................................................4
1.3.6 运行截图................................................................................................................................................7
1.4 心得体会 ......................................................................................................................................................8
实验 2 语法分析程序 ...................................................................................................................................10
2.1 实验目的 .................................................................................................................................................... 10
2.2 实验任务 .................................................................................................................................................... 10
2.3 实验内容.................................................................................................................................................... 10
2.3.1 实验要求............................................................................................................................................. 10
2.3.2 输入格式............................................................................................................................................. 10
2.3.3 输出格式............................................................................................................................................. 10
2.3.4 提交要求............................................................................................................................................. 10
2.3.5算法描述............................................................................................................................................10
2.3.6 程序清单..............................................................................................................................................15
2.3.7 调试情况及各种情况运行结果截图..................................................................................................22
2.4 心得体会 .................................................................................................................................................... 24
实验 3 基于 LR(0)方法的语法分析 ............................................................................................................. 24
3.1 实验目的 .................................................................................................................................................... 24
3.2 实验任务 .................................................................................................................................................... 25
3.3 实验内容.................................................................................................................................................... 25
3.3.1 实验要求..............................................................................................................................................25
3.3.2输入格式............................................................................................................................................25
3.3.3输出格式............................................................................................................................................25
3.3.4 算法描述..............................................................................................................................................25
3.3.5 代码:..................................................................................................................................................26
3.3.6 调试情况及各种情况运行结果截图..................................................................................................31
3.4 心得体会 .................................................................................................................................................... 33
实验 4 语义分析和中间代码生成................................................................................................................34
4.1 实验目的 .................................................................................................................................................... 34
4.2 实验任务 .................................................................................................................................................... 34
4.3 实验内容.................................................................................................................................................... 34
4.3.1 实验要求.............................................................................................................................................34
4.3.2 输入格式.............................................................................................................................................36
1
4.3.3 输出格式.............................................................................................................................................36
4.3.4 算法描述..............................................................................................................................................37
4.3.5 程序源码.............................................................................................................................................38
4.3.6 运行截图..............................................................................................................................................49
4.4 心得体会 .................................................................................................................................................... 49
2
编译原理 实验报告
实验 1 词法分析
1.1 实验目的
(1)理解有穷自动机及其应用。
(2)掌握 NFA 到 DFA 的等价变换方法、DFA 最小化的方法。
(3)掌握设计、编码、调试词法分析程序的技术和方法。
1.2 实验任务
借助词法分析工具 GNU Flex,编写一个对使用 C--语言书写的源代码进行词法分
析(C--语言的文法参见附录 A),并使用 C 语言完成
1.3 实验内容
1.3.1 实验要求
你的程序要能够查出源代码中可能包含的词法错误:词法错误(错误类型 A):(以
输入 C--源代码为例)即出现 C--词法中未定义的字符。
1.3.2 输入格式
你的程序的输入是一个包含 C--源代码的文本文件,程序需要能够接收一个输入文件名
作为参数。例如,假设你的程序名为 cc、输入文件名为 test1、程序和输入文件都位于
当前目录下,那么在 Linux 命令行下运行./cc test1 即可获得以 test1 作为输入文件的
输出结果。
1.3.3 输出格式
通过标准输出打印程序的运行结果。对于那些包含词法错误的输入文件,只 要输出相
关的词法有误的信息即可。在这种情况下,注意不要输出任何与语法树有关的内容。 要
求输出的信息包括错误类型、出错的行号以及说明文字,其格式为:Error type [错误类
型] at Line [行号]: [说明文字]
对于那些没有任何词法错误的输入文件,你的程序需要打印每一个词法单元的名称以及
与其对应的词素,无需打印行号。词法单元名与相应词素之间以一个冒号和一个空格隔
开。每一条词法单元的信息单独占一行。
1.3.4 算法描述
(1)设计思路
3
编译原理 实验报告
主要实现按语言的词法规则从源程序中逐个识别单词,把字符串形式的源程序转化成单
词串的形式,并做相应的分类。对一个完整的模块分为输入,处理,输出三部分。
输入,编写 flex 源文件,对 c 语言的关键字,运算符,标识符,常量,界符依据其特征
写出相应正规式。
处理,为正规式,编写识别规则,并要考虑分析过程中优先级问题。
输出,调用相关函数,将单词串写到 txt 文本文件。
(2)识别规则算法实现
借助 flex 自带的动作函数 yytext,指向与正规式匹配的待分析的字符,再由 Fprintf 函
数将字符写入指定文件,yylineno 记录字符所在的行数。
(3)输出算法实现
定义两个文本文件,分别存储正确的及有错误的单词串。设置全局变量 flag,识别过程中
若有错误,flag 变化。分析完后判断,flag 是否发生变化,若发生变化,删除多余文件,
重命名另一个文件。
1.3.5 程序源码
定义%{
FILE*yycout=NULL;
intflag=0;
%}
%optiondebug
%optionyylineno
INT_DEX[1-9][0-9]*|[0]
INT_HEX[0][Xx]([1-9][0-9]*|[0])
INT_OCT[0][0-7]
FLOAT
TYPEint|float
ID[a-zA-Z_][a-zA-Z_0-9]*
[0-9]*[.][0-9]+([eE][+-]?[0-9]*|[0])?f?
4
编译原理 实验报告
IF[if]
ELSE[else]
WHILE[while]
STRUCT[struct]
RETURN[return]
SPACE[\n\t]
SEMI
[;]
COMMA
[,]
ASSIGNOP[=]
RELOP[>]|[<]|[>][=]|[<][=]|[=][=]|[!][=](^[=])
[+]
PLUS
MINUS[-]
STAR[*]
DIV[/]
AND[&][&]
OR[|][|]
DOT[.]
NOT[!]
LP\(RP\)
LB\[RB\]
LC\{RC\}
SEP[^;,\n\t\(\)\[\]\{\}\+\/\*<>=!&\|-]+
NOTE\/\/.*\n
%%{INT_DEX}|{INT_HEX}|{INT_OCT}{fprintf(yycout,"INT:%s\n",yytext);}
识别规则
5
编译原理 实验报告
{FLOAT}
{fprintf(yycout,"FLOAT:%s\n",yytext);}
{TYPE}{fprintf(yycout,"TYPE:%s\n",yytext);}
{ID}{fprintf(yycout,"ID:%s\n",yytext);}
{IF}{fprintf(yycout,"IF:%s\n",yytext);}
{ELSE}{fprintf(yycout,"ELSE:%s\n",yytext);}
{WHILE}{fprintf(yycout,"WHILE:%s\n",yytext);}
{STRUCT}{fprintf(yycout,"STRUCT:%s\n",yytext);}
{RETURN}{fprintf(yycout,"RETURN:%s\n",yytext);}
{SPACE}{}
{SEMI}{fprintf(yycout,"SEMI:%s\n",yytext);}
{COMMA}{fprintf(yycout,"COMMA:%s\n",yytext);}
{ASSIGNOP}{fprintf(yycout,"ASSIGNOP:%s\n",yytext);}
{RELOP}{fprintf(yycout,"RELOP:%s\n",yytext);}
{PLUS}{fprintf(yycout,"PLUS:%s\n",yytext);}
{MINUS}{fprintf(yycout,"MINUS:%s\n",yytext);}
{STAR}{fprintf(yycout,"STAR:%s\n",yytext);}
{DIV}{fprintf(yycout,"DIV:%s\n",yytext);}
{AND}{fprintf(yycout,"AND:%s\n",yytext);}
{OR}{fprintf(yycout,"OR:%s\n",yytext);}
{DOT}{fprintf(yycout,"DOT:%s\n",yytext);}
{NOT}{fprintf(yycout,"NOT:%s\n",yytext);}
{LP}{fprintf(yycout,"LP:%s\n",yytext);}
{RP}{fprintf(yycout,"RP:%s\n",yytext);}
{LB}{fprintf(yycout,"LB:%s\n",yytext);}
{RB}{fprintf(yycout,"RB:%s\n",yytext);}
{LC}{fprintf(yycout,"LC:%s\n",yytext);}
{RC}{fprintf(yycout,"RC:%s\n",yytext);}
{NOTE}{fprintf(yycout,"NOTE:%s\n",yytext);}
{SEP}{
at
A
fprintf(yyout,"Error
type
Line
%d:Mysterious
character
6