本次笔记内容:
6-1 类型表达式
6-2 声明语句的翻译

本节课幻灯片,见于我的 GitHub 仓库:第11讲 中间代码生成_1.pdf

文章目录

  • 类型表达式 Type Expression
    • 举例
  • 声明语句的翻译
    • 局部变量的存储分配
    • 变量声明语句的SDT
    • 例:"real x; int i;"的语法制导翻译
    • 例:数组类型表达式"int[2][3]"的语法制导翻译

类型表达式 Type Expression

基本类型是类型表达式:

  • integer
  • real
  • char
  • boolean
  • type_error (出错类型)
  • void (无类型)

基本类型是类型表达式,可以为类型表达式命名,类型名也是类型表达式;将类型构造符 (type constructor) 作用于类型表达式可以构成新的类型表达式:

  • 数组构造符 array
    • 若 T 是类型表达式,则 array(I, T) 是类型表达式( I 是一个整数)
  • 指针构造符 pointer
    • 若 T 是类型表达式,则 pointer ( T ) 是类型表达式,它表示一个指针类型
  • 笛卡尔乘积构造符 ×
    • 若 T1 和 T2 是类型表达式,则笛卡尔乘积 T1 × T2 是类型表达式
  • 函数构造符→
    • 若 T1、T2、…、Tn 和 R 是类型表达式,则T1×T2×…×Tn→R 是类型表达式
  • 记录构造符 record
    • 若有标识符 N1 、N2 、…、Nn 与类型表达式 T1 、T2 、…、Tn ,则 record ((N1×T1) × (N2×T2) × … × (Nn×Tn)) 是一个类型表达式

举例

C程序片段如下:

struct stype
{char[8] name;int score;
};
stype[50] table;
stype* p;

和 stype 绑定的类型表达式:

  • record ((name × array(8, char)) × (score × integer))

和 table 绑定的类型表达式:

  • array (50, stype)

和 p 绑定的类型表达式:

  • pointer (stype)

声明语句的翻译

局部变量的存储分配

对于声明语句,语义分析的主要任务就是收集标识符的类型等属性信息,并为每一个名字分配一个相对地址

  • 从类型表达式可以知道该类型在运行时刻所需的存储单元数量称为类型的宽度(width)
  • 编译时刻,可以使用类型的宽度为每一个名字分配一个相对地址

名字的类型相对地址信息保存在相应的符号表记录中。

变量声明语句的SDT


举例,如上第 ⑤ 个产生式:假设一个指针占用 4 个字节,那么其中 T.width = 4

enter( name, type, offset ):在符号表中为名字name创建记录,将name的类型设置为type,相对地址设置为offset

例:"real x; int i;"的语法制导翻译


首先验证,是不是LL1文法:

  • 具有相同左部的产生式,他们的可选集是否不相交。
  • ②与③有相同的左部,②的 SELECT集,就是 T 的 FIRST集,T 的 FIRST集取决于 B 的 FIRST集,B 的 FIRST集有 int 和 real ,另外指针关键字 point 也在 T 的 FIRST集;
  • 而③的 SELECT集是 FOLLOW-D,可以看出 FOLLOW-D 后面此时跟的是 $ 符号。
  • 所以 ② 与 ③ 产生式的 SELECT集互不相交。
  • 其他产生式同理。符合LL1文法。

在语法制导翻译时,注意 offset 变量的变化。

例:数组类型表达式"int[2][3]"的语法制导翻译


为什么从T开始推导?

之前那个时类型声明,从 P 开始;这个是表达式,从T开始推导。

【编译原理笔记11】中间代码生成:类型表达式,声明语句的翻译相关推荐

  1. 【编译原理笔记20】代码生成:代码生成器的主要任务,一个简单的目标机模型,指令选择,寄存器的选择,寄存器选择函数getReg的设计,窥孔优化

    本次笔记内容: 9-1 代码生成器的主要任务 9-2 一个简单的目标机模型 9-3 指令选择 9-4 寄存器的选择 9-5 寄存器选择函数getReg的设计 9-6 窥孔优化 本节课幻灯片,见于我的 ...

  2. 编译原理笔记(二)之词法分析

    编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...

  3. zucc 编译原理 笔记

    zucc 编译原理 笔记 lec02 lec03 lec04

  4. 三万五千字长文!让你懂透编译原理(六)——第六章 属性文法和语法制导翻译

    三万五千字长文!让你懂透编译原理(六)--第六章 属性文法和语法制导翻译 长文预警 系列文章传送门: 万字长文+独家思维导图!让你懂透编译原理(一)--第一章 引论 万字长文!让你懂透编译原理(二)- ...

  5. 【编译原理笔记14】中间代码生成:布尔表达式的回填,控制流语句的回填,switch语句的翻译,过程调用语句的翻译

    本次笔记内容: 6-8 布尔表达式的回填 6-9 控制流语句的回填 6-10 SWITCH语句的翻译 6-11 过程调用语句的翻译 本节课幻灯片,见于我的 GitHub 仓库:第14讲 中间代码生成_ ...

  6. 【编译原理笔记01】什么是编译,编译系统各结构作用

    资源Bilibili AV17649289 编译原理 哈尔滨工业大学 陈鄞 本次笔记内容: 1-1 什么是编译 1-2 编译系统的结构 1-3 词法分析 1-4 语法分析概述 1-5 语义分析概述 1 ...

  7. 了解编译原理-笔记小结

    这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译 ...

  8. 编译原理拉链回填技术c语言,编译原理笔记1:概述编译相关的基本知识

    本系列为个人编译原理学习笔记,谬误之处恳请高人指点,感激不尽! 内容整理自西安电子科技大学 王小兵.张南.鱼滨老师的编译原理课程. 编译器的工作步骤 在开始说任何东西之前,我们先来大致看一下编译器是怎 ...

  9. 编译原理笔记3 词法分析 龙书

    正则表达式(Regular Expression,RE) 啥是正则表达式//比较简单略写- 正则表达式(Regular Expression,RE) 是一种用来描述正则语言(3型语言)的更紧凑的表示方 ...

最新文章

  1. 用Flutter改造ZS项目小记一:界面显示一张图片
  2. 创建一个storageevent事件_事件循环:微任务和宏任务
  3. 【操作系统】高速缓存和缓冲区
  4. Go语言(二)—基本概述
  5. ubuntu的web服务器_如何在Ubuntu上安装OpenLiteSpeed Web服务器?
  6. 百度面试题:Median of Two Sorted Arrays(java实现)
  7. 河南科技大学计算机学院录取名单,【计算机考研复试通知】2018年河南科技大学硕士研究生复试通知...
  8. 正则表达网络三剑客之sed
  9. 华为S5700交换机通过命令开启snmp功能
  10. WorkNC3D沿面精加工快速修圆小技巧
  11. 深入浅出 Docker
  12. SWD是一种串行调试接口
  13. 虚拟机soft lockup CPU死锁问题
  14. 制作表白墙,给TA一个惊喜吧
  15. OA供应商考核管理平台,构建清晰画像,精准筛选优质供应商
  16. 状态转移矩阵(status transition matrix )
  17. “十进制网络”遭质疑 数字域名被当作笑话
  18. JIL Widget开发入门
  19. MT7621基于OpenWrt 21.02使用DSA配置VLAN
  20. 李振杰:细数视频行业历史 爱奇艺诠释拼爹时代

热门文章

  1. 关于Eclipse中各个文件(*.java *.jsp *.xml)文字大小的设定。
  2. 【PostgreSQL-9.6.3】进程及体系结构
  3. 【PostgreSQL-9.6.3】psql常用命令
  4. 解决Linux系统在设置alias命令重启后失效的问题
  5. 【报错】解决logstash tracking_column not found in dataset. {:tracking_column=>“updated_time“}问题
  6. IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题)
  7. 解决java使用Runtime.exec执行linux复杂命令不成功问题
  8. java向mysql插入数据乱码问题解决
  9. django解决页面跳转问题
  10. 在Objective-C中,如何测试对象类型?