第六章第七章总结

第六章:属性文法和语法制导翻译

1.属性文法:是在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。

属性代表与文法符号相关的信息,和变量一样,可以进行计算和传递。又可以分类为综合属性和继承属性。

2,语义规则:对于文法的每一个产生式配备一组属性的计算规则。


3.语义规则所描述的工作:属性计算,静态语义查询,符号表操作,代码生成。

4.基于属性文法的处理方法:

(1)处理过程:输入串→语法树→依赖图→语义规则计算次序→计算结果,这种由源程序的语法结构所驱动的处理办法就是语法制导翻译法。

(2)依赖图:在一颗语法树中的结点的继承属性和综合属性之间的相互依赖关系可以用称作依赖图的一个有向图来描述。


(3)一遍扫描的处理方法:一遍扫描的处理方法是在语法分析的同时计算属性值,而不是语法分析构造语法树之后进行属性的计算,而且无需构造实际的语法树。

5.S属性文法的自下而上计算

S属性文法,它只含有综合属性。综合属性可以在分析符号串的同时由自上而下的分析器来构造。分析器可以保存与栈中文法符号有关的综合属性值。每当进行归约时,新的属性值就由栈中正在归约的产生式右边符号的属性值来计算。可以通过扩充分析器中的栈来存放这些综合属性值。S-属性文法的翻译器通常可借助于LR分析器实现。



第七章:语义分析和中间代码产生

1.语义分析:审查每一个语法结构的静态语义,即验证语法正确的结构是否有意义,在语义正确的基础上生成一种中间代码或目标代码。语义分析的范围包括确定类型,类型检查,识别含义,控制流检查,一致性检查,相关名字检查

2.语义描述工具:目前流行的是用属性文法作为描述寓意的工具。

3.语义分析方法:根据描述属性文法的语义规则的方式不同可以分为:语法制导定义,翻译方案

4.几种常用的中间语言形式

(1)逆波兰式: 波兰表示是一种既不须考虑优先关系、又不用括号的一种表示表达式的方法(前缀式),现在我们要介绍的刚好是另一种波兰表示形式,称为后缀式,即运算符在后。

(2)图表示法:


(3)三元式:三元式由三个部分组成,算符:OP,第一运算分量:ARG1,第二部分运算分量:ARG2


(4)间接三元式:在三元式的基础上附加一张指示器表─间接码表,按运算的先后顺序列出有关三元式在三元式表中的位置。


(5)四元式:一个四元式是一个带有四个域的记录结构:op,arg1,arg2及result。它实际上就是一条三地址的指令。


6.基于语法制导的翻译

(1)条件跳转的三地址实现方法:

对于跳转采用四元式的形式实现。把四元式存入一个数组中,数组下标就代表四元式的符号,并约定:

    四元式(jnz,a,_,p)  表示 if a goto p

    四元式(jrop,x,y,p)表示 if x rop y goto p

    四元式(j,_,_,p)      表示 goto p

(2)控制语句中布尔表达式的翻译:

 出现在条件语句if-then,if-else-end,while-do的布尔表达式E,它的作用仅在于控制对S1和S2的选择。

    作为条件转移的E,仅把E翻译成代码:一串条件转移和无条件转移的四元式。

    生成代码为:if E goto E.true

                       goto E.false

(3)数组元素地址的计算公式

①一维数组的数组元素计算公式:bace-low*w +  i*w 

②对于一个二维数组,可以按行或按列存放: base-((low1 *n2)+low2)*w+ ((i1*n2)+i2)* w  

③多维数组A[i1,i2,...,ik] 的地址的计算:a[i1,i2,…in]的地址=base-c+v

c=((...((low1*n2+low2)*n3+low3)...)*nk+lowk) * w 

变量部分v= ((...((i1*n2+i2)*n3+i3...)*nk+ik)*w 、

知识应用:



总结:

这两章的内容相对于前边三章的内容,对我来说稍微容易理解点,第七章还稍微简单点,但还是只会纸上谈兵,看能看懂,做题就不会,没有思路。或者换个思路就不会了。感觉还是要多加练习。

猜你喜欢

转载自blog.csdn.net/qq_37278309/article/details/80717374