文章目录
一、什么是后缀式?
1.后缀式的特点是什么?
每一运算符都置于其运算对象之后,即操作数写在前面,算符写在后面。
表达式中各个运算是按运算符出现的顺序进行的,故无需用括号来指示运算顺序,因而又称为无括号式。
2.如何将中缀式转换成后缀式?
从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;
若是符号,则判断其与栈顶符号的优先级,是右括号或者优先级低于栈顶符号(乘除优先加减,)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止
二、图表示法
1.什么是抽象语法树,举例说明?
在语法树中去掉一些对翻译不必要的信息后,获得
的更有效的源程序的中间表示,这种经过变换后的语法
树称为抽象语法树。
内部结点代表操作符,它的孩子代表对应的操作数。
树表示法:
索引法:
2. 举例说明什么是DAG,与抽象语法树有什么区别?
DAG(Directed Acyclic Graph)无循环有向图, 与抽象语法树类似,但是在一个DAG中代表公共子表达式的结点可有多个父结点
- 区别:
- DAG可以成环 抽象语法树没有环
- 表现在公共子表达式上,DAG中代表公共子表达式的结点具有多个父结点,而一棵语法树中公共子表达式被表示为重复子树。
3.产生赋值语句抽象语法树的属性文法
三、地址码
1.什么是三地址码?各种语句的三地址码形式;
最基本的形式: x=y op z
其中x、y、z为名字、常数或编译时产生的临时变量;
op代表运算符号。每个语句的右边只能有一个运算符
2.三地址码的三种表示形式:三元式、四元式、间接三元式;
- 三元式: 三元式顾名思义就是带有三个域的记录结构(i)(op,arg1,arg2)
- 四元式:四元式实际上是一种“三地址语句”的等价表示,是一个带有四个域的记录结构。(op,arg1,arg2,result)四元式只能有一个运算符,所以,一个复杂的表达式只能由多个四元式构成的序列表示。
- 间接三元式:建立两个与三元式有关的表格,一个称为三元式表,用于存放各元式本身;另一个称为执行表,它按照三元式的执行顺序,依次列出相应各三元式在三元式表中的位置,也就是说我们用一个三元式表连同执行表来表示中间代码。通常我们称这种表示方法为间接三元式。
3.三元式、四元式、间接三元式各自优缺点
- 三元式没有result字段,且不需要临时变量,故三元式比四元式占用的存储空间少
- 在进行代码优化处理时,需要从现有的运算序列中删去某些运算或挪动一些运算的位置,这对三元式来说是很困难的,但四元式之间的相互联系是通过临时变量来实现的,所以影响就比较小
- 由于间接三元式在执行表中已经依次列出每次要执行的那个三元式,若其中有相同的三元式,则仅需在三元式表中保存其中之一,即就是说三元式的项数一般比执行表的项数少
- 当进行代码优化需要挪动运算顺序时,则只需对执行表进行相应地调整,而不必再改动三元式本身
4. 三元式与间接三元式之间的区别
- 由于间接三元式在执行表中已经依次列出每次要执行的那个三元式,若其中有相同的三元式,则仅需在三元式表中保存其中之一,即三元式的项数一般比执行表的项数少;
- 当进行代码优化需要挪动运算顺序时,则只需对执行表进行相应地调整,而不必再改动三元式本身,这样,就避免了前面讲到的因改变三元式的顺序所引起的麻烦