编译原理 语义分析

故事扮演 提交于 2020-01-14 02:28:20

1. 语义与语法的区别

在这里插入图片描述
<1> 语法与语义的关系
语法是指语言的结构、即语言的“样子”;语义是指附着于语言结构上的实际含意 ,即语言的“意义”。
对于语法和语义:
语义不能离开语法独立存在;
语义远比语法复杂;
同一语言结构可包含多种含意,不同语言结构可表示相同含意;
语法与语义之间没有明确的界线。

重点:语义分析的两个作用

1.检查是否结构正确的句子所表示的意思也合法;
2.执行规定的语义动作,如:
表达式求值
符号表填写
中间代码生成等

<3> 语义分析的方法

语法制导翻译

2. 中间代码

在这里插入图片描述

重点:要求中间代码具有如下特性,以便于编译器的开发移植和代码的优化:

便于语法制导翻译;
既与机器指令的结构相近,又与具体机器无关。

3.后缀式

在这里插入图片描述

定义

一个表达式E的后缀形式可以如下定义:
(1)如果E是一个变量或常量,则E的后缀式是E本身。
(2)如果E是E1 op E2形式的表达式,这里op是任何二元操作符,则E的后缀式为E1’E2’ op,这里E1’和E2’分别为E1和E2的后缀式。
(3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。
如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+
(a+b)c-(a+b)/e的后缀表达式为:
(a+b)c-(a+b)/e
→((a+b)c)((a+b)/e)-
→((a+b)c
)((a+b)e/)-
→(ab+c
)(ab+e/)-
→ab+c
ab+e/-

算法实现

将一个普通的中序表达式转换为逆波兰表达式的一般算法是:
首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为输入逆波兰式的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。可指定其他字符,不一定非#不可。从中缀式的左端开始取字符,逐序进行如下步骤:
(1)若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈
(2)若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级(不包括括号运算符)大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否则,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,最后将该运算符送入S1栈。
(3)若取出的字符是“(”,则直接送入S1栈顶。
(4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”。
(5)重复上面的1~4步,直至处理完所有的输入字符
(6)若取出的字符是“#”,则将S1栈内所有运算符(不包括“#”),逐个出栈,依次送入S2栈。
完成以上步骤,S2栈便为逆波兰式输出结果。不过S2应做一下逆序处理。便可以按照逆波兰式的计算方法计算了!

4.后缀式的计算

在这里插入图片描述
在这里插入图片描述

5.三地址码

在这里插入图片描述
在这里插入图片描述

6.四元式主要由四部分组成:

(OP,arg1,arg2,result)
其中,OP是运算符,argl,arg2分别是第一和第二个运算对象,result是编译程序为存放中间运算结果而引进的变量,常称为临时变量。当OP是一目运算时,常常将运算对象定义为arg1。
在这里插入图片描述
四元式出现的顺序和语法成份的计值顺序相一致。
四元式之间的联系是通过临时变量实现的,这样易于调整和变动四元式。
便于优化处理。

三地址代码

三地址代码是四元式的另一种表示形式

在这里插入图片描述

例题有文法 G 和 G 的语法制导翻译如下:

E → E1*T { E.place=newtemp;

emit(*,E1.place,T.place,E.place; }

| T { E.place=T.place; }

T → T1+F { T.place=newtemp;

emit(+,T1.place,F.place,T.place; }

| F { T.place=F.place; }

F → (E) { F.place=E.place; }

| id { F.place=id.name; }

(a) 求句型 (T+F)*id 的短语、直接短语以及句柄;

(b) 根据语法制导翻译写出句子 ab+cd 的中间代码;

© (若 a=3 , b=5 , c=7 , d=8 ,请给出中间代码计算结果;

(d) 将文法 G 简化为: E → E*T|T , T → T+F|F , F → id 。给出它的识别活前缀的 DFA 。
在这里插入图片描述
在这里插入图片描述

7.符号表

在这里插入图片描述

8. 数组元素的引用

(1)数组元素的地址计算

注意是行主存储还是列主存储
在这里插入图片描述
(2)☆数组元素引用的语法制导翻译(考试热点之一)

9. 布尔表达式

在这里插入图片描述
布尔表达式的计算有两种方法:数值表示的直接计算和逻辑表示的短路计算
在这里插入图片描述
在这里插入图片描述

☆ 布尔表达式短路计算的翻译:短路计算的控制流,真出口与假出口,真出口链与假出口链,拉链回填技术(P207 例4.41)(考试热点之一)

10. 控制语句

控制语句的分类:①无条件转移、②条件转移、③循环语句、④分支语句

无条件转移(goto)\条件转移(if、while)
条件转移的语法制导翻译:P213 例4.42

11.过程的定义与声明

在这里插入图片描述

左值和右值

在这里插入图片描述
在这里插入图片描述
左值式地址,右值是值
根据参数传递的左右值不同
调用可分为:
1.值调用 (传递右值)
2.引用调用 (传递左值)

拉链回填

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!