编译原理之语义分析和中间代码的生成

一、什么是后缀式?

1.后缀式的特点是什么?

每一运算符都置于其运算对象之后,即操作数写在前面,算符写在后面。
表达式中各个运算是按运算符出现的顺序进行的,故无需用括号来指示运算顺序,因而又称为无括号式。

2.如何将中缀式转换成后缀式?

从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;
若是符号,则判断其与栈顶符号的优先级,是右括号或者优先级低于栈顶符号(乘除优先加减,)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止

二、图表示法

1.什么是抽象语法树,举例说明?

在语法树中去掉一些对翻译不必要的信息后,获得
的更有效的源程序的中间表示,这种经过变换后的语法
树称为抽象语法树。
内部结点代表操作符,它的孩子代表对应的操作数。
树表示法:
在这里插入图片描述
索引法:
在这里插入图片描述

2. 举例说明什么是DAG,与抽象语法树有什么区别?

DAG(Directed Acyclic Graph)无循环有向图, 与抽象语法树类似,但是在一个DAG中代表公共子表达式的结点可有多个父结点

  • 区别:
  1. DAG可以成环 抽象语法树没有环
  2. 表现在公共子表达式上,DAG中代表公共子表达式的结点具有多个父结点,而一棵语法树中公共子表达式被表示为重复子树。

3.产生赋值语句抽象语法树的属性文法

在这里插入图片描述

三、地址码

1.什么是三地址码?各种语句的三地址码形式;

最基本的形式: x=y op z
其中x、y、z为名字、常数或编译时产生的临时变量;
op代表运算符号。每个语句的右边只能有一个运算符
在这里插入图片描述

2.三地址码的三种表示形式:三元式、四元式、间接三元式;

  • 三元式: 三元式顾名思义就是带有三个域的记录结构(i)(op,arg1,arg2)
    在这里插入图片描述
  • 四元式:四元式实际上是一种“三地址语句”的等价表示,是一个带有四个域的记录结构。(op,arg1,arg2,result)四元式只能有一个运算符,所以,一个复杂的表达式只能由多个四元式构成的序列表示。
    在这里插入图片描述
    在这里插入图片描述
  • 间接三元式:建立两个与三元式有关的表格,一个称为三元式表,用于存放各元式本身;另一个称为执行表,它按照三元式的执行顺序,依次列出相应各三元式在三元式表中的位置,也就是说我们用一个三元式表连同执行表来表示中间代码。通常我们称这种表示方法为间接三元式。
    在这里插入图片描述

3.三元式、四元式、间接三元式各自优缺点

  1. 三元式没有result字段,且不需要临时变量,故三元式比四元式占用的存储空间少
  2. 在进行代码优化处理时,需要从现有的运算序列中删去某些运算或挪动一些运算的位置,这对三元式来说是很困难的,但四元式之间的相互联系是通过临时变量来实现的,所以影响就比较小
  3. 由于间接三元式在执行表中已经依次列出每次要执行的那个三元式,若其中有相同的三元式,则仅需在三元式表中保存其中之一,即就是说三元式的项数一般比执行表的项数少
  4. 当进行代码优化需要挪动运算顺序时,则只需对执行表进行相应地调整,而不必再改动三元式本身

4. 三元式与间接三元式之间的区别

  1. 由于间接三元式在执行表中已经依次列出每次要执行的那个三元式,若其中有相同的三元式,则仅需在三元式表中保存其中之一,即三元式的项数一般比执行表的项数少;
  2. 当进行代码优化需要挪动运算顺序时,则只需对执行表进行相应地调整,而不必再改动三元式本身,这样,就避免了前面讲到的因改变三元式的顺序所引起的麻烦

5. 对赋值语句产生地址代码的属性文法

在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值