- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译器的程序设计
专业:
班级:
学号:
姓名:
摘要
编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的结构。
其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而上分析法。针对不同程序语言的语法规则可以采取不同的分析方法,当然两种方法也可以同时使用。语法分析器把语法单元作为输入供语义分析器使用。一般的语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。上面三个过程可以与硬件无关,而接下来的优化器和目标代码生成器是针对某一种处理器而言的。代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代码。目标代码生成器最终生成可以在某种机器上运行的机器语言或者汇编语言。在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。
下图给出了编译系统的结构框图
表
表
格
管
理
出
错
处
理
单词符号
语法单元
中间代码
中间代码
目标代码
语法分析器
语义分析与中间代码生成器
优化器
目标代码生成器
词法分析器
二、总体设计方案及主要设计原理
2.1、单词符号及种别表示
单词符号
种别编码
单词值
main
1
int
2
float
3
double
4
char
5
if
6
else
7
do
8
while
9
l(l|d)*
10
内部字符串
( +|-|ε ) d*(.dd* | ε)( e ( +|-|ε ) dd*|ε)
20
二进制数值表示
=
21
+
22
-
23
*
24
/
25
(
26
)
27
{
28
}
29
,
30
;
31
32
=
33
34
=
35
==
36
!=
37
2.2、语法结构定义
程序 ::= main()语句块
语句块 ::= ‘{‘语句串’}’ //程序用括号括起来
语句串::=语句{;语句};
语句::=赋值语句|条件语句|循环语句
赋值语句::=ID=表达式 //赋值语句用”=”号
条件语句::=if条件语句块 //条件怎么没有括号,囧(自己加1个)
循环语句::=do 语句块while 条件
条件::=表达式关系运算符表达式
表达式 ::= 项{ +项|-项}
项 ::= 因子{*因子|/因子}
因子 ::=ID|num|(表达式)
num::= ( +|-|ε ) 数字*(.数字数字* | ε)( e ( +|-|ε ) 数字数字*|ε)
ID::=字母(字母|d数字)*
字母::=a|b|c…|z|A|B|C…|Z
数字::=0|1|2…|9
关系运算符 ::= |=||=|==|!=
2.3、主要算法
2.3.1、词法分析主要算法
这部分对源文件进行分析,允许/* */注释。从源文件依次读取字符,对字符进行分析,组成字符串、数字、关系符等固定含义的token符,并把它们添加到token链中,如果遇到非法字符报错并退出程序。
2.3.2、语法分析主要思想
这部分对Token链进行分析,利用自底向上的分析方法,构建SLR(1)分析表的过程是手工完成的。语法分析的同时构建语法树,移进时创建叶子,规约时创建节点。
2.3.3、语义分析主要分析
这部分对语法树从左到右进行遍历,节点记录了规约式的编号,遍历到节点时就进行相应处理。语义分析主要检查变量、函数是否被定义或重定义,同时产生四元式。
三、源程序代码
#includestdio.h
#includestring.h
#includemath.h
#includestdlib.h
char prog[80]; //存放所有输入字符
char token[8]; //存放词组
char ch; //单个字符
int syn,p,m,n,i; //syn:种别编码
double sum;
int count;
int isSignal; //是否带正负号(0不带,1负号,2正
您可能关注的文档
最近下载
- 2025年二建《建设工程施工管理》精选考点汇总.pdf VIP
- 出口扫描系列·变局篇:找寻出口商品的“稳定之星”.pdf VIP
- 开关站10kV开关柜检修试验标准化作业指导书1.pdf
- 2023年江西机电职业技术学院高职单招语文/数学/英语考试题库答案详解.docx
- 人教版高中数学必修五1.1.1《正弦定理》教学课件1 (共13张PPT).ppt VIP
- GB_T 15114-2023 铝合金压铸件.docx
- 2024年度组织生活会支部班子对照检查材料.doc VIP
- 5.1+人要自强+课件-+2024-2025学年统编版道德与法治七年级下册.pptx VIP
- 弱电系统维保方案(三篇).pdf VIP
- 义务教育劳动课程标准(2022年版).pdf
文档评论(0)