北华航天工业学院
目 录
第 1 章
第 2 章
第 3 章
第 4 章
课程设计目的 ................................................................................................................ 1
课程设计要求 ................................................................................................................ 1
课程设计内容 ................................................................................................................ 1
设计方案 ........................................................................................................................ 4
4.1 模块划分 ............................................................................................................................. 4
4.1.1 词法分析 .................................................................................................................. 4
4.1.2 语法分析 .................................................................................................................. 4
4.1.3 语义分析 .................................................................................................................. 5
4.1.4 错误处理 .................................................................................................................. 5
4.2 模块调用 ............................................................................................................................. 5
4.3 模块程序流程图................................................................................................................. 7
4.3.1 词法分析流程图......................................................................................................7
4.3.2 语法分析流程图......................................................................................................8
4.3.3 语义分析流程图......................................................................................................9
程序源代码 .................................................................................................................. 10
5.1.1 词法分析:”词法分析.h”...................................................................................... 10
5.1.1 语法分析 : “Main.cpp”...................................................................................... 15
程序测试数据和结果 ..................................................................................................22
6.1 源文件内容....................................................................................................................... 22
6.2 文法 分析表..................................................................................................................... 22
6.2.1 文法 语义函数 ......................................................................................................22
6.2.2 分析表.................................................................................................................... 24
5.3 测试结果 ........................................................................................................................... 27
6.1 设计体会 ........................................................................................................................... 31
6.1.1 程序不足及改进....................................................................................................31
6.1.2 系统特色 ................................................................................................................ 31
6.2 结束语...............................................................................................错误!未定义书签。
第 5 章
第 6 章
北华航天工业学院
第 1 章 课程设计目的
《编译原理》课程设计是编译原理课程必不可少的一个环节,通过课程设计,加深对编
译原理的教学内容的了解,以及实现编译原理各部分知识的融合。进而提高学生分析问题、
解决问题,从而运用所学知识解决实际问题的能力。
第 2 章 课程设计要求
1.明确课设任务,复习与查阅有关资料
2.按要求完成课设内容,课设报告要求文字和图工整、思路清楚、正确。
3.注意增强程序界面的友好性。凡用户输入时,给出足够的提示信息使用户感到方便
使用。
4.注意提高程序的可读性和可理解性:程序中应有适当的注释,变量命名应符合实际
含义,程序结构清晰,易于阅读和理解。
第 3 章 课程设计内容
一、课程设计目的
《编译原理》课程设计是编译原理课程必不可少的一个环节,通过课程设计,加深对编
译原理的教学内容的了解,以及实现编译原理各部分知识的融合。进而提高学生分析问题、
解决问题,从而运用所学知识解决实际问题的能力。
二、课程设计要求
1.明确课设任务,复习与查阅有关资料
2.按要求完成课设内容,课设报告要求文字和图工整、思路清楚、正确。
3.注意增强程序界面的友好性。凡用户输入时,给出足够的提示信息使用户感到方便
使用。
4.注意提高程序的可读性和可理解性:程序中应有适当的注释,变量命名应符合实际
含义,程序结构清晰,易于阅读和理解。
三、课程设计内容
1.题目:编译程序构造
2.内容:涉及词法分析、自下而上语法分析程序的实现:SLR(1)分析器的实现以
及生成中间代码。
3.具体要求
根据 LR 分析算法构造 SLR(1)分析程序,并完成语法分析动作(当需要一个单词时,
调用词法分析程序获取),同时完成语义分析生成四元式输出。要求程序具有通用性,改变
文法时只需改变程序的数据初值,无需改变程序主体;
(1)基本要求:完成 1 条说明语句、2 条算数表达式和赋值语句的翻译,生成中间代码。
1
北华航天工业学院
(2)高级要求:在完成基本要求的基础上,实现 if 语句和布尔表达式的翻译。if 语句
的文法和翻译方案参见课本。
变量说明语句的文法及相应的语义子程序:.att 表示数据类型属性,fill 函数表示将单词
id 及其类别属性填写符号表。
(0)S→D; {acc}
(1)D→int id
(2)D→float id
(3)D→D(1),id
{ fill(id,int);D.att=int; }
{fill(id,float); D.att=float;
{ fill(id,D(1).att);D.att=D(1).att; }
}
算数表达式和赋值语句的文法及相应的语义子程序。
(1)A→id=E;
{p=lookup(id.name);
emit(E.PALCE, , p);}
(2)E→E(1)+T
(3)E→T
{E.PALCE=newtemp();
emit(+,E(1).PALCE,T.PALCE,E.PALCE)}
{E.PALCE=T.PALCE;}
(4)T→T(1)*F
{T.PALCE=newtemp();
emit(+,T(1).PALCE,F.PALCE,T.PALCE)}
(5)T→F
(6)F→(E)
(7)F→id
(8)F→num
{T.PALCE=F.PALCE;}
{ F.PALCE=E.PALCE;}
{P=LOOKUP(id.name)
F.PALCE=P;}
{ P=LOOKUP(num.value)
F.PALCE=P;}
构造其用于 SLR(1)分析的识别活前缀的 DFA 以及 action 表和 goto 表。然后编程实现。
(关于词法分析部分只需识别出与此文法相关的单词即可(+,*,(,),id,=))。
4.程序设计提示:
(1)分析栈设计时可以用一个栈完成,也可以设计三个栈:一个符号栈,一个状
态栈,一个语义栈,则归约时,则需要在符号栈中退掉 n 个符号,在状态栈中退掉 n 个符号
(n 为产生式符号个数),语义栈中退掉 n 个符号对应的语义;
(2)终结符表和非终结符表的组织和预测分析程序中相同(将符号对应到一个数
字,表示在分析表中对应的下标)。
(3)action 表中的错误处理:简化的错误处理:当查找 action 表出现空白时,则
当前单词无法移进和规约,可简单的认为当前单词为多余的单词,则抛弃当前单词,读下一
单词继续分析。
5.测试数据:
作为程序测试数据,以赋值语句 area=r*r+r$作为测试输入(源程序)。程序要求输
出二元式序列、符号表、语法分析过程、四元式序列。
假设 AA.TXT 的文件内容如下:
int area,r;
r=1;
area=r*r+r;
程序运行情况如下:
请输入源文件名称:E:\AA.TXT<回车>
2
北华航天工业学院
语义栈
动作说明
语法分析过程如下:
状态栈
符号栈
源程序对应的二元式如下:
(int,-)
(id,0)
(,,-)
(id,1)
(;,-)
(id,1)
(=,)
(num,0)
(id,0)
(=,)
(id,1)
(*,)
(id,1)
(+,)
(id,1)
(;,-)
符号表如下:
Name
area
r
0
1
value
addr
type
int
int
数字表如下
源程序对应的四元式序列如下:
(=,1, , r)
(*,r,r,T1)
(+,T1,r,T2)
(=,T2,,area)
分析过程完成。
6.程序扩展要求
有能力的同学可将编译程序扩展布尔表达式、if 语句的分析和四元式生成,布尔表达
式和 if 语句的翻译参见教材。
四、课程设计过程要求
每人独立完成上述设计内容,完成后由教师验收认可,最后上交实验报告和设计成果以
及成果使用说明书,实验报告每人独立撰写,设计成果放在一个文件夹中,文件夹用学生学
号+姓名命名。
3
北华航天工业学院
第 4 章 设计方案
4.1 模块划分
4.1.1 词法分析
词法分析程序是编译程序主要组成部分之一,它的主要任务是从构成源程序的字符串中
识别出一个个具有独立意义的最小语法单位(单词)。词法分析程序的输入为字符串,而输出
为提供给语法分析的单词串。为了能有效地从源程序文本中分离出这些单词,词法分析程序
必须对源程序文本进行编辑,例如消除文本中的注释、空格、换行符以及其它一切对语法分
析和代码生成均无关的信息。除此之外,为了能正确识别出单词,有时还需要区别一串字符
究竟是保留字(如 IF)还是标识符。有时为了将标识符、常量等转换为内部形式并插入表格
中,词法分析程序还需要执行维护符号表的工作,等等。
词法也是语法的一部分,词法描述完全可以归并到语法描述中去,只不过词法规则更简
单些。这在后面的章节中可以看到。为什么将词法分析做为一个独立的阶段? 为什么把编译
过程的分析工作划分成词法分析和语法分析两个阶段? 主要的考虑因素为:
1. 使整个编译程序的结构更简洁、清晰和条理化。词法分析比语法分析简单的多,但
是由于源程序结构上的一些细节,常使得识别单词的工作甚为曲折和费时。例如,空白和注
释的处理;
2.编译程序的效率会改进。大部分编译时间是花费在扫描字符以把单词符号分离出来。
把词法分析独立出来,采用专门的读字符和分离单词的技术可大大加快编译速度。另外,由
于单词的结构可用有效的方法和工具进行描述和识别,进而可建立词法分析程序的自动构造
工具。
3. 增强编译程序的可移植性。在同一个语言的不同实现中,或多或少地会涉及到与设
备有关的特征,比如采用 ASCII 还是 EBCDIC 字符编码。都可置于词法分析程序中解决而不
影响编译程序其它成分的设计。
处理词法分析程序与语法分析程序之间的关系又可采用两种方式:一种方式是将词法分
析作为单独一遍扫描,即在语法分析之前,实现源程序的全部词法分析工作,其输出(单词
申)形成一个中间文件(内部符号形式的源程序表),移交给语法程序。另一种方式为将词法分
析程序编写成一个子程序,每当语法分析程序需要读一个新单词时,便去调用它。本次课程
设计采用前一种方式。
4.1.2 语法分析
语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法
分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生
成作准备。执行语法分析任务的程序叫语法分析程序或语法分析器。
语法分析程序以词法分析输出的符号串作为输入,在分析过程中检查这个符号串是否为
该程序语言的句子。若是,输出该句子的分析树;若不是,则表示源程序存在语法错误,需
4
北华航天工业学院
要报告错误的性质和位置。
常用的语法分析方法大体上可以分成自顶向下和自底向上两大类:
1. 自顶向下分析方法:语法分析从顶部(树根、语言的识别符号)到底部(叶子、语言的
终结符号)为输入的符号串建立分析树。本章介绍的递归下降分析方法和 LL 分析方法就属于
自顶向下分析方法。
2. 自底向上分析方法:语法分析从底部到顶部为输入的符号串建立分析树。最常见的
LR 分析方法采用的就是自底向上分析方法。我们将在第五章介绍这种分析方法。
无论采用哪种分析方法,语法分析都是自左向右地读入符号。
4.1.3 语义分析
语义分析是编译过程的一个逻辑阶段, 语义分析的任务是对结构上正确的源程序进行
上下文有关性质的审查,进行类型审查。语义分析是审查源程序有误语义错误,为代码生成
阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言
规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。如有的编译程序要对实
数用作数组下标的情况报告错误。又比如某些某些程序规定运算对象可被强制,那么当二目
运算施于一整型和一实型对象时,编译程序应将整型转换为实型而不能认为是源程序的错
误。
4.1.4 错误处理
错误处理在整个编译程序中都占有很重要的地位,它贯穿于整个编译程序的前后,词法
分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成都涉及错误处理,一
个好的词法分析器,错误处理应该占有举足轻重的地位。错误处理的完善是一个编译程序功
能强大的后盾。
4.2 模块调用
语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法
分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生
成作准备。
5
如图 4-2-1 所示。
词
法
分
析
器
错
误
处
理
北华航天工业学院
语法分析器
错
误
处
理
语
义
分
析
错
误
处
理
图 4-2-1 模块调用
中
间
代
码
生
错
误
处
理
6
北华航天工业学院
4.3 模块程序流程图
4.3.1 词法分析流程图
N
数字
Y
读 取 数
N
Error
特殊字符
Y
读取字符
错误状态
查 询 常 量
相 同
N
填 常 数
Y
图 3-3-1 所示
开始
初 始
N
字母
Y
读 标 识
查 关 键 字
关 键
N
查标识表
Y
相 同
Y
N
填 标 识 符
写到输出流
N
EOF
Y
结束
结束
图 3-3-1 词法分析流程图
7