编译原理------语义分析器之中间代码的表示形式

一、语义分析器

作用:紧接在词法分析语法分析之后,编译程序要做的工作是进行静态语义检查翻译

静态语义检查

  • 类型检查。操作数于操作符类型一致
  • 控制流检查。控制转移到合理位置
  • 一致性检查。变量只能声明一次,同一case语句的标号不能相同,枚举类型的元素不能相同等
  • 变量作用域分析
  • 等等

翻译

翻译成中间代码

二、中间代码的语言形式

1、逆波兰式(又称:后缀表达式)

方法:把运算量(操作数)写在前面,把算符写在后面

2、图表示法(DAG 和 AST)

  • DAG:有向无环图
  • AST:抽象语法树

二者区别:公共表达式表现不同;DAG通过多个父节点表示,AST通过重复子树表示。

3、三地址代码(三元式、四元式、间接三元式)

三地址:2个操作数地址 + 1个操作结果地址

具体存储实现:四元式三元式间接三元式

  • 四元式:[op, 操作数1地址操作数2地址操作数结果存储地址 | 跳转op的下一个地址]

  • 三元式:标号【op操作数1地址操作数2地址]

一条三地址语句,一行。

  • 间接三元式:【间接代码表】、地址标号【op操作数1地址操作数2地址]

一个操作,一行。在使用间接代码表示三地址代码执行顺序

三、语义分析中各种语句的处理

1、声明语句

不生成可执行代码,只涉及符号表的操作。

2、赋值语句翻译

包括:在符号表查找名字,存取数组和记入的元素。

会生成中间代码,可用AST、三地址码形式表示

简单赋值语句:

数组:

3、布尔表达式翻译

布尔表达式:优先级(高->低):not、and、or

关系表达式:

a < b 等价于 if a<b then 1 else 0

例子:

4、控制语句翻译

If语句

while语句

在例如:

 --------------------------------------------------本文结束------------------------------------------------------------------

博主说:

各位看官,你们好!

       到这篇文章为止,编译原理中关于编译器概述文法词法分析语法分析语义分析的相关理论知识就结束了!

       对于剩下的优化器目标代码生成器,我就不再写了(因为,我也不会。😂😂😂)。对于编译器的实现有兴趣的小伙伴们,可以另外找文章阅读。

       感谢看官们,垂爱这篇文章。🙇‍♂️🙇‍♂️🙇‍♂️。

任意门:

编译原理------概述-CSDN博客

编译原理------文法-CSDN博客

编译原理------词法分析器-CSDN博客

编译原理------语法分析器(一) 自上而下的推导(LL1文法)-CSDN博客

编译原理------语法分析(二)自下而上的归约(算符优先,LR分析)-CSDN博客

编译原理------语义规则的描述工具(属性文法)和属性计算过程(语法制导翻译)-CSDN博客

  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值