王朝百科
分享
 
 
 

四元式

王朝百科·作者佚名  2012-03-05  
宽屏版  字体: |||超大  

四元式四元式是一种更接近目标代码的中间代码形式。由于这种形式的中间代码便于优化处理,因此,在目前许多编译程序中得到了广泛的应用。

四元式实际上是一种“三地址语句”的等价表示。它的一般形式为:

(op,arg1,arg2,result)

其中, op为一个二元 (也可是一元或零元)运算符;arg1,arg2分别为它的两个运算 (或操作)对象,它们可以是变量、常数或系统定义的临时变量名;运算的结果将放入result中。四元式还可写为类似于PASCAL语言赋值语句的形式:

result ∶= arg1 op arg2

需要指出的是,每个四元式只能有一个运算符,所以,一个复杂的表达式须由多个四元式构成的序列来表示。例如,表达式A+B*C可写为序列

T1∶=B*C

T2∶=A+T1

其中,T1,T2是编译系统所产生的临时变量名。当op为一元、零元运算符 (如无条件转移)时,arg2甚至arg1应缺省,即result∶=op arg1或 op result ;对应的一般形式为:

(op,arg1,,result)

(op,,,result)

在实际产生的四元式中,op往往用一整型数表示 (操作符的代码),它可能附带有不止一种属性。例如,加运算可以分为定点加法和浮点加法两种,我们可用不同的整数值区分这两种加法。至于四元式中运算对象arg1、arg2和结果域result,它们可以是指向符号表中某项的指示字,也可以是某个临时变量的序号,因此,在实际的翻译过程中,还需要进行相应的查填符号表工作。在本章中,由于我们只作原理性讨论,所以假定临时变量来自一个用之不竭的集合,而不去追求其经济性。三元式为了节省临时变量的开销,有时也可采用一种三元式结构来作为中间代码,其一般形式为:

○i(op,arg1,arg2)

其中,○i为三元式的编号,也代表了该三元式的运算结果;op,arg1,arg2的含义与四元式类似,区别仅在于arg可以是某三元式的序号,表示用该三元式的运算结果作为运算对象。例如,对于赋值语句

a∶=-b*(c+d)

若用三元式表示,则可写成

①(Uminus, b, - )

②( + , c, d )

③( * , ①, ② )

④( ∶= , a, ③ )

式①中的运算符Uminus表示一元减运算。

下面,我们仍以算术表达式到三元式的翻译为例,说明如何为各产生式设计语义动作。为此,先定义翻译过程中要使用的若干辅助函数:

int LookUp(char*Name)——以Name (变量名)查符号表,若查到则返回相应登记项的序号(≥1),否则,返回0。

int Enter(char*Name)——以Name为名字在符号表中登录新的一项,返回值为该项的序号。

int Entry(char*Name)——以Name为名字查、填符号表,即

int Entry(char*Name)

{ int i=LookUp(Name);

if(i) return i;

else return Enter(Name);

}

注意,在实际的编译系统中,还应区分当前是否在处理说明部分:若是说明部分,则查表时i应为0 (否则Name被重复定义);若非,则i不能为0(否则Name尚未被定义)。

int Trip(int op,int arg1,int arg2)——根据给定的参数产生一个三元式

(op,arg1,arg2)

并将它送入三元式表中,其返回值为该三元式在表中序号。为区分参数arg所表示的是三元式编号还是变量,约定当arg<0时表示三元序号;arg>0表示变量在符号表中登记项的序号;arg=0表示参数为空。

利用这些函数,我们可构造将表达式翻译成三元式的S属性翻译文法如下:

1Expr′→Expr{$$=$1;}

2Expr→Expr ′+′ Term{$$=Trip(′+′,$1,$3);}

3|Term{$$=$1;}

4|′-′Term{$$=Trip(Uminus,$2,0);}

5Term→Term′*′Factor{$$=Trip(′*′,$1,$3);}

6| Factor{$$=$1;}

7Factor→ ′(′ Expr ′)′ {$$=$2;}

8| iden{$$=Entry($1);}

在产生式8中,终结符号iden的属性是它的词文yytext(其值由LEX所生成的扫描器提供),用$1表示。每个非终结符号都有一个属性,代表以该符号为根的语法树的一个子树的运算结果,该属性的取值可以是整型数,或为一个三元式的序号,或为符号表项的序号。

比较三元式和四元式这两种表示方法可以看出,无论在一个三元式序列还是四元式序列中,各个三元式或四元式都是按相应表达式的实际运算顺序出现的。其次,对同一表达式而言,所需的三元式或四元式的个数一般是相同的。不过,由于三元式没有Result字段,且不需要临时变量,故三元式比四元式占用的存储空间少。另一方面,当进行代码优化处理时,常常需要从现有的运算序列中删去某些运算,或者需要挪动一些运算的位置,这对于三元式序列来说,是很困难的。因为,三元式间的相互引用一般非常频繁,而这些引用又是通过其中的指示字来实现的,所以,一些三元式的删除或挪动,有时会造成需要大量修改指示字内容的局面。但对于四元式序列来说,由于四元式之间的相互联系是通过临时变量来实现的,所以,更改其中一些四元式给整个序列带来的影响比三元式的情况小得多。

为了克服三元式表示不便于优化的缺点,可在中间代码生成过程中,建立两个与三元式有关的表格。一个称为三元式表,用于存放各三元式本身;另一个称为执行表,它按照各三元式的执行顺序,依次列出相应各三元式在三元式表中的编号。也就是说,现在我们用一个三元式表连同执行表来表示中间代码,通常我们将此种表示方式称为间接三元式。例如,对于如下赋值语句

x∶=(a+b)*c;

b∶=a+b;

y∶=c*(a+b)

若按三元式表示,可写成

①(+, a,b)⑤(+, a,b)

②(*, ①,c)⑥(*, c,⑤)

③(∶=, x,②)⑦(∶=, y,⑥)

④(∶=, b,①)

其中,三元式①和⑤形式完全一致,但却不能将⑤省去;对于②,⑥来说,也应当说是一致的 (因为乘法满足交换律),同样不能将⑥省去。然而若按间接三元式表示,则可写成

执行表三元式表

①①(+, a, b)

②②(*, ①,c)

③③(∶=,x,②)

④④(∶=,b,①)

①⑤(∶=,y,②)

由此可见,这两种表示法的区别之一就是,对于间接三元式表示而言,由于在执行表中已经依次列出每次要执行的那个三元式,若其中有相同的三元式,则仅需在三元式表中保存其中之一。这就意味着,三元式表的项数一般比执行表的项数少。

另外,当进行代码优化需要挪动运算顺序时,则只需对执行表进行相应的调整,而不必再改动三元式表本身。这样,就避免了前述因改变三元式的顺序所引起的麻烦。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如何用java替换看不见的字符比如零宽空格&#8203;十六进制U+200B
 干货   2023-09-10
网页字号不能单数吗,网页字体大小为什么一般都是偶数
 干货   2023-09-06
java.lang.ArrayIndexOutOfBoundsException: 4096
 干货   2023-09-06
Noto Sans CJK SC字体下载地址
 干货   2023-08-30
window.navigator和navigator的区别是什么?
 干货   2023-08-23
js获取referer、useragent、浏览器语言
 干货   2023-08-23
oscache遇到404时会不会缓存?
 干货   2023-08-23
linux下用rm -rf *删除大量文件太慢怎么解决?
 干货   2023-08-08
刀郎新歌破世界纪录!
 娱乐   2023-08-01
js实现放大缩小页面
 干货   2023-07-31
生成式人工智能服务管理暂行办法
 百态   2023-07-31
英语学习:过去完成时The Past Perfect Tense举例说明
 干货   2023-07-31
Mysql常用sql命令语句整理
 干货   2023-07-30
科学家复活了46000年前的虫子
 探索   2023-07-29
英语学习:过去进行时The Past Continuous Tense举例说明
 干货   2023-07-28
meta name="applicable-device"告知页面适合哪种终端设备:PC端、移动端还是自适应
 干货   2023-07-28
只用css如何实现打字机特效?
 百态   2023-07-15
css怎么实现上下滚动
 干货   2023-06-28
canvas怎么画一个三角形?
 干货   2023-06-28
canvas怎么画一个椭圆形?
 干货   2023-06-28
canvas怎么画一个圆形?
 干货   2023-06-28
canvas怎么画一个正方形?
 干货   2023-06-28
中国河南省郑州市金水区蜘蛛爬虫ip大全
 干货   2023-06-22
javascript简易动态时间代码
 干货   2023-06-20
感谢员工的付出和激励的话怎么说?
 干货   2023-06-18
 
>>返回首页<<
 
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有