Sematics3-实验代码示例

1. while语句的翻译

  1. 类型声明与使用(符号表)
  2. 类型检查
  3. 中间代码生成,要有大局观
  4. 认清"你"在语法分析树中所处的位置

1.1. While语句的SDD

S.code=⋅⋅⋅∣gotoL1S.code = ···|goto\ L1 S.code=⋅⋅⋅∣goto L1

  1. C.code是返回回来的

    1. C.false的赋值就是告诉其应该跳转到哪里,这里跳转到S.next,也就是跳转到S的兄弟节点
    2. C.true的赋值就是跳转到L2进行
  2. S1.next = L1是保证其可以完成循环中提前跳转,比如continue
  3. 后面那是S1.code
  4. C.true和C.false都是继承属性。

1.2. while语句的SDT

1.3. 用一个递归下降语法分析器实现while语句的翻译

  1. next是S的继承属性

  1. 使用全局缓冲区

    1. 比如L1在缓冲区,C生成的部分放到缓冲区即可,以此类推。
    2. 避免了出现中间代码有重复
    3. 避免了拼接的问题

2. Definition (符号表(Symbol Table))

符号表是用于保存各种信息的数据结构

  1. 标识符:词素、类型、大小、存储位置等

  1. 通常使用HashTable

2.1. 为每个作用域建立单独的符号表

可以使用符号表栈实现树形的嵌套关系

  1. 每一个作用于都会有一张单独的符号表(哈希表)
  2. 符号表栈:及时出栈

翻译任务:忽略声明部分,为每个标识符标明类型

2.2. Definition (类型表达式(Type Expressions))

  1. 基本类型是类型表达式;

    1. char, bool, int, float, double, void,. . .
  2. 类名是类型表达式;
  3. 如果t是类型表达式,则array(num, t)是类型表达式;
  4. record(⟨id : t, . . .⟩)是类型表达式;
  5. 如果sss和ttt是类型表达式,则s∗ts * ts∗t(笛卡尔积)是类型表达式;
  6. 如果sss和ttt是类型表达式,则s→ts \rightarrow ts→t(表示函数,sss输入,ttt为输出)是类型表达式;
  7. 类型表达式可以包含取值为类型表达式的变量。



2.3. 类型声明

  1. 符号表中记录标识符的类型、宽度(width)、偏移地址(offset)

2.4. 需要为每个record生成单独的符号表

  1. 全局变量t与w将B的类型与宽度信息递给产生式C→ϵC \rightarrow \epsilonC→ϵ
  2. float x

2.5. 数组类型的语法制导

int[2][3]int[2][3] int[2][3]

  1. 全局变量offset表示变量的相对地址
  2. 全局变量top表示当前的符号表

floatx;floaty;float\ x; float\ y; float x;float y;

  1. record类型表达式:record(top)
  2. 全局变量top表示当前的符号表
  3. 全局变量Env表示符号表栈
  4. record { float x; float y; } p;

2.6. 完整的例子

  • offset稳定增长
  • top可能会回退

2.7. 类型检查的常见形式

2.8. 结构等价和名等价

2.8.1. Definition (结构等价(Structurally Equivalent))

  1. 两种类型结构等价当且仅当以下任一条件为真:

    1. 它们是相同的基本类型;
    2. 它们是将相同的类型构造算子应用于结构等价的类型而构造得到;
    3. 一个类型是另一个类型表达式的名字。

2.8.2. Definition (名等价(Name Equivalent))

  1. 两种类型名等价当且仅当以下任一条件为真:

    1. 它们是相同的基本类型;
    2. 它们是将相同的类型构造算子应用于结构等价的类型而构造得到。

2.8.3. 结构等价中的"结构"又是什么意思?

array(n, t)       array(m, t)
record(⟨a: int⟩)   record(⟨b: int⟩)
  1. 取决于语言设计者的"大局观"

2.9. 类型综合

根据子表达式的类型确定表达式的类型

E1+E2E_1+E_2 E1​+E2​

  1. 重载函数的类型综合规则

2.10. 类型推导

根据某语言结构的使用方式确定表达式的类型

  • null(x) :x是一个列表,它的元素类型未知
  • C++ 的 Template

2.11. 类型转换


  1. 拓宽是从下向上,比如short和char做运算,那么会都先转化为int然后计算,也就是找到最小共有祖先。
  2. 窄化是从上向下

  1. 类型不相同,但是兼容,则转化。

编译原理-18-语法分析实验代码示例相关推荐

  1. 【实验】编译原理——编译器认知实验

    系列文章目录 学习笔记 [学习笔记]编译原理--第一章 编译引论 [学习笔记]编译原理--第二章 词法分析 实验 [实验]编译原理--编译器认知实验 文章目录 系列文章目录 学习笔记 实验 一.实验目 ...

  2. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...

  3. Huffman 编码原理详解(代码示例)

    1.概述 huffman编码是一种可变长编码(  VLC:variable length coding))方式,于1952年由huffman提出.依据字符在需要编码文件中出现的概率提供对字符的唯一编码 ...

  4. 【编译原理】课程实验——基于Java的词法分析与语法分析

    ⭐⭐⭐⭐⭐⭐ Github主页

  5. 编译原理2-Bison语法分析

    ps:补上了图 实验要求 了解 Bison 基础知识和理解 Cminus-f 语法(重在了解如何将⽂法产⽣式转换为 Bison 语句) 阅读 /src/common/SyntaxTree.c ,对应头 ...

  6. sql注入pythonpoco_SQL注入原理与解决方法代码示例

    一.什么是sql注入? 1.什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网 ...

  7. 编译原理:词法分析实验报告

    词法分析实验报告 文章目录 词法分析实验报告 一.实验目的 二.实验原理 三.实验要求 四.实验步骤(利用Java语言来进行词法分析) ① 待分析的语言词法 ② 单词符号对应的种别码 ③ 词法分析程序 ...

  8. 编译原理词/语法分析

    效果: 代码: 1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: usi ...

  9. 编译原理之语法分析(自底向上)(包含源码)

    编译器之语法分析 自底向上 基本概念 算符优先 SLR 规范LR LALR 自底向上 基本概念 自底向上形成语法树的过程就是及逆行归约,将一堆单词串放在一起,形成某个产生式的样子,然后规约成某个产生式 ...

  10. 算符优先文法编写java语法分析器,编译原理课程设计实验报告——基于算符优先分析方法的表达式语法分析器...

    内容简介: 一.设计目的 了解用算符优先法对表达进行语法分析的方法,掌握自顶向下的预测语法分析程序的手工构造方法. 二.设计内容 对简单表达式文法构造算符优先分析器. 三.设计要求 1.对下列简单表达 ...

最新文章

  1. Python 字典(Dictionary) get()方法
  2. 使用抽象等设计工具创建一个稳固的核心机制
  3. python工作招聘-爬了招聘网站之后,给你几点学习Python的建议
  4. Atcoder AGC031B Reversi (DP计数)
  5. 【Python】Pandas中的宝藏函数-transform()
  6. mysql存储过程并行_Mysql存储过程的执行顺序问题
  7. rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问
  8. cmd执行sql文件路径 oracle_oracle 基础 执行sql文件
  9. mac安装go语言环境
  10. 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
  11. 人跟人的格局真的是不一样的
  12. model Ensemble
  13. FOSCommentBundle功能包:指南索引页
  14. python json解释器_Python JSON
  15. js自动弹窗被拦截 html,JS打开新窗口防止被浏览器阻止的方法
  16. eeglab基础学习
  17. Codeforces 831 A Unimodal Array
  18. 计算机一级常用英语缩写,电脑常用英文单词和缩写
  19. pandas.melt()详解
  20. emacs下安装eaf

热门文章

  1. R语言_根据马科维茨投资组合理论画出最优投资组合线
  2. 0-12V的模拟量隔离模块的一些感悟
  3. Django笔记十一之外键查询优化select_related和prefetch_related
  4. 读书·2018(14本)
  5. 拥有“中国诺贝尔奖”的未来论坛,会告诉我们怎样的未来? | 未来论坛 2017...
  6. 计算机设计大赛参赛作品——疫情看板
  7. 故障:笔记本开机时自动打开 NumLock 键
  8. 电脑开机显示自动修复失败无法进入系统,解决方法(亲试有效!!!)
  9. 【预测模型】预测某地区未来 10-20 年按年龄划分的人口结构(PDE模型)
  10. HDU4699 Editor(双栈对弹)