【编译原理】学习记录1_程序编译过程


前端:该阶段的编译工作主要依赖源程序,与目标机无关。

【语法分析】

在词法分析基础上,将单词序列分解成各类语法短语(也称语法单位,如:“程序”“语句”“表达式”)。可表示成语法树(推导树)。
通过语法分析,确定一个输入串是否构成一个语法上正确的程序。

即:经语法分析可以得到一个分析树。

问:如何根据单词序列构造语法分析树?经过怎样的语法分析?

【语义分析】

审查源程序是否含有语义错误,即是否符合语言规范,为代码生成阶段收集类型信息。
如,判断每个算符的运算对象类型是否符合语言规范:
在语法分析树上增加语义处理结点,进行一些类型转换。
问:依据语法分析树中的算符类型,判断该算符的运算对象类型是否符合该算符的语言规范?

【中间代码生成】

中间代码:一种结构简单、含义明确的记号系统。(有些编译程序不需要该过程)
如,类似“三地址指令”的“四元式”中间代码:
(算符,运算对象1,运算对象2,结果)
问:是否是对符合语言规范的语法分析树,进行一定规则的处理计算,得到对应处理结果,并记录?


后端:依赖于目标机,而不依赖源语言。

【目标代码生成】

目标代码:由中间代码变换成的,特定机器上的绝对指令代码、可重定位的指令代码、汇编指令代码。
问:按照何种规则,将中间代码(或者符合语言规范的语法分析树)转换成指令?


贯穿整个编译过程:

【表格管理】

编译过程中源程序的各种信息被保留在种种不同的表格里;

【出错处理】

源程序中的错误出现,记录错误性质和错误地点,缩小出错影响,甚至自动纠正错误。



文法:
将拥有有穷或无穷语句的语言,通过制定有限规则有穷表示出来,严格定义句子的结构。

即:以有穷集合刻画无穷集合的一个工具。
匹配规则左端的符号,替换成规则右边的符号串。(规则,也称重写规则、产生式或生成式,用于形式化表示句子)

文法描述的语言是该文法下一切句子的集合(句子只包含终结符,句型可包含非终结符)。
#文法的描述

【语法图】
即语法描述图,用来直观易读地描述语法规则
【EBNF】巴科斯-瑙尔范式


【语义处理】
编译中的语义处理,用于
检查语法结构合法的程序是否真正有意义(审查每个语法结构的静态语义——静态语义分析或静态审查);
翻译成中间代码,或者直接翻译成目标代码(翻译)。
 

【属性文法】

#属性
编译程序使用的语法树的结点,可以用“类型”“值”“存储位置”等来描述它。

每个属性与文法中的 某个非终结符或终结符相关联;
每个断言与文法中的 某个产生式相关联。
语义规则与产生式相关联。
问:产生式与语义规则有何种联系?在一个文法中的作用是?

问:如何判断某个句子是否属于该文法描述的语言?
答:针对某一输入串(句子)而言,属性文法中所有断言对该输入串的语法树结点的属性全为真,那么,这个句子就是在该语言中的。

 

【语法制导翻译】

基于属性文法的处理过程,即语法制导翻译
对单词符号串进行语法分析,构造语法分析树,根据需要构造属性依赖图
遍历语法树,并在语法树各结点处,按语义规则进行计算。
(在语法制导的定义中,一条语义规则完成一个计算属性值的动作。对于一个终结符,只使用综合属性,且其属性值由词法分析器提供,通常不计算其属性值)

TIP:关于综合属性和继承属性的理解
继承属性是 从上而下传递信息。 综合属性自下而上传递信息。
终结符只有综合属性,非终结符既有综合属性也可有继承属性。
综合属性可以在分析输入符号串的同时自下而上的计算。

问:什么是属性依赖图?如何构造属性依赖图?
答:属性依赖图是一个有向图,用于描述语法分析树中,各属性和属性间的相互依赖关系。

具体如何构造参看 属性依赖图的构造算法

为分析树中的每个结点的文法符号的每个属性,创建一个结点(为文法符号的各属性创建结点);
依据分析树中每个结点所用产生式对应的每一个语义规则,
将该产生式文法符号的属性结点,用一条有向边连接起来(根据产生式对应语法规则,构造各属性间的有向边)。

问:属性依赖图的作用是什么?
答:根据属性依赖图的拓扑排序,可以得到计算语义规则的顺序
按照这个拓扑排序得到的语义规则计算顺序进行计算,就可以得到输入串的翻译

问:如何进行属性计算?
树遍历:采用某种遍历方法遍历语法树,直至计算出各个属性(最常用的是深度优先遍历,从左到右遍历的方法)。
一遍扫描:在语法分析的同时计算属性值(不是先构建语法分析树,再进行属性计算)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值