您的位置:首页 > 其它

编译原理 语义分析题型

2020-02-03 10:02 183 查看

中间语言的形式

常见的中间语言的形式:
后缀式(逆波兰式)
三地址代码

  • 三元式
  • 四元式
  • 间接三元式

后缀式

又称逆波兰表示法,把运算量(操作数)写在前面,把算符写在后面(后缀)。
如:a+b 写成 ab+
a+b * c 写成 abc * +
后缀式要注意的是运算符号优先级
C语言中运算符优先级排序如下:
优先级【高到低】:
分为优先级15级:

1、圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】;

2、逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++】【 --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*】【&】、长度运算符【sizeof】;

3、乘法运算符【*】、除法运算符【/】、取余运算符【%】;

4、加法运算符【+】、减法运算符【-】;

5、左移动运算符【<<】、右移动运算符【>>】;

6、关系运算符【< 】【>】【<=】【 >= 】;

7、等于运算符【==】、不等于运算符【!=】;

8、按位与运算符【&】;

9、按位异或运算符【^】;

10、按位或运算符【|】;

11、逻辑与运算符【&&】;

12、逻辑或运算符【||】;

13、条件运算符【?:】;

14、赋值运算符【=】【/=】【*=】【%=】【+=】【-=】【<<=】【>>=】【&=】【^=】【|=】;

15、逗号运算符【,】
转自百度百科 运算符

题型:求后缀式

a+b*(c+d/e)>f
后缀式:abcde/+*+f>
(如果加上更多种类运算符就更需要记住它们的优先级)

三元式

带有三个记录域:op(操作符),arg1(左操作数),arg2(右操作数)
(op,arg1,arg2)
如:y+1
(+,y,1)
间接三元式
将按运算的先后顺序列出有关三元式在三元式表中的位置
如:x[i] :=y
(0) (=[ ],x,i)
(1) (:=,(0),y)
x := y[i]
(0) ( [ ]=,y,i)
(1) (:=,x,(0))

四元式

带有四个记录域:op,arg1,arg2,result
如:y:=x+1
(1)(+,x,1,T)
(2)(:=,T,-,y)

翻译模式

布尔表达式的翻译

优先级:not>and>or
A or B : if A then true else B
A and B : if A then B else false
not A : if A then false else true

作为条件控制的布尔表达式

if E then S1 else S2,作为转移条件的布尔表达式E,可赋予它两个出口,一个为“真”出口,出向S1;一个为“假”出口,出向S2

题型:用四元式实现三地址代码

(jnz,a,-,p)表示if a goto p
(jrop,x,y,p)表示if x rop y goto p
rop为操作符,例 j-
(j,-,-,p)表示 goto p

例:while (a<b) do
if (c<d) then x:=y+z

//a<b判断语句while循环,true则跳到(3)
(1)( j< , a , b ,(3))
//判断语句为false则跳到(8)结束
(2)( j , - , - , (8) )
//c<d判断语句,为true跳到(5)
(3)( j< , c , d , (5))
//判断语句为false则跳到(1)
(4)( j , - , - , (1))
//y,z相加赋值给T
(5)( + , y , z , T )
//T的值赋值给x
(6)( := , T , - , x )
//运行完then后的语句跳转回while循环(1)
(7)( j , - , - , (1))
(8)下一条语句

  • 点赞
  • 收藏
  • 分享
  • 文章举报
秃头生活 发布了29 篇原创文章 · 获赞 0 · 访问量 492 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: