编译原理-18-语法分析实验代码示例
Sematics3-实验代码示例
1. while语句的翻译
- 类型声明与使用(符号表)
- 类型检查
- 中间代码生成,要有大局观
- 认清"你"在语法分析树中所处的位置
1.1. While语句的SDD
S.code=⋅⋅⋅∣gotoL1S.code = ···|goto\ L1 S.code=⋅⋅⋅∣goto L1
- C.code是返回回来的
- C.false的赋值就是告诉其应该跳转到哪里,这里跳转到S.next,也就是跳转到S的兄弟节点
- C.true的赋值就是跳转到L2进行
- S1.next = L1是保证其可以完成循环中提前跳转,比如continue
- 后面那是S1.code
- C.true和C.false都是继承属性。
1.2. while语句的SDT
1.3. 用一个递归下降语法分析器实现while语句的翻译
- next是S的继承属性
- 使用全局缓冲区
- 比如L1在缓冲区,C生成的部分放到缓冲区即可,以此类推。
- 避免了出现中间代码有重复
- 避免了拼接的问题
2. Definition (符号表(Symbol Table))
符号表是用于保存各种信息的数据结构。
- 标识符:词素、类型、大小、存储位置等
- 通常使用HashTable
2.1. 为每个作用域建立单独的符号表
可以使用符号表栈实现树形的嵌套关系
- 每一个作用于都会有一张单独的符号表(哈希表)
- 符号表栈:及时出栈
翻译任务:忽略声明部分,为每个标识符标明类型
2.2. Definition (类型表达式(Type Expressions))
- 基本类型是类型表达式;
- char, bool, int, float, double, void,. . .
- 类名是类型表达式;
- 如果t是类型表达式,则array(num, t)是类型表达式;
- record(⟨id : t, . . .⟩)是类型表达式;
- 如果sss和ttt是类型表达式,则s∗ts * ts∗t(笛卡尔积)是类型表达式;
- 如果sss和ttt是类型表达式,则s→ts \rightarrow ts→t(表示函数,sss输入,ttt为输出)是类型表达式;
- 类型表达式可以包含取值为类型表达式的变量。
2.3. 类型声明
- 符号表中记录标识符的类型、宽度(width)、偏移地址(offset)
2.4. 需要为每个record生成单独的符号表
- 全局变量t与w将B的类型与宽度信息递给产生式C→ϵC \rightarrow \epsilonC→ϵ
- float x
2.5. 数组类型的语法制导
int[2][3]int[2][3] int[2][3]
- 全局变量offset表示变量的相对地址
- 全局变量top表示当前的符号表
floatx;floaty;float\ x; float\ y; float x;float y;
- record类型表达式:record(top)
- 全局变量top表示当前的符号表
- 全局变量Env表示符号表栈
- record { float x; float y; } p;
2.6. 完整的例子
- offset稳定增长
- top可能会回退
2.7. 类型检查的常见形式
2.8. 结构等价和名等价
2.8.1. Definition (结构等价(Structurally Equivalent))
- 两种类型结构等价当且仅当以下任一条件为真:
- 它们是相同的基本类型;
- 它们是将相同的类型构造算子应用于结构等价的类型而构造得到;
- 一个类型是另一个类型表达式的名字。
2.8.2. Definition (名等价(Name Equivalent))
- 两种类型名等价当且仅当以下任一条件为真:
- 它们是相同的基本类型;
- 它们是将相同的类型构造算子应用于结构等价的类型而构造得到。
2.8.3. 结构等价中的"结构"又是什么意思?
array(n, t) array(m, t)
record(⟨a: int⟩) record(⟨b: int⟩)
- 取决于语言设计者的"大局观"
2.9. 类型综合
根据子表达式的类型确定表达式的类型
E1+E2E_1+E_2 E1+E2
- 重载函数的类型综合规则
2.10. 类型推导
根据某语言结构的使用方式确定表达式的类型
- null(x) :x是一个列表,它的元素类型未知
- C++ 的 Template
2.11. 类型转换
- 拓宽是从下向上,比如short和char做运算,那么会都先转化为int然后计算,也就是找到最小共有祖先。
- 窄化是从上向下
- 类型不相同,但是兼容,则转化。
编译原理-18-语法分析实验代码示例相关推荐
- 【实验】编译原理——编译器认知实验
系列文章目录 学习笔记 [学习笔记]编译原理--第一章 编译引论 [学习笔记]编译原理--第二章 词法分析 实验 [实验]编译原理--编译器认知实验 文章目录 系列文章目录 学习笔记 实验 一.实验目 ...
- STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读
记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...
- Huffman 编码原理详解(代码示例)
1.概述 huffman编码是一种可变长编码( VLC:variable length coding))方式,于1952年由huffman提出.依据字符在需要编码文件中出现的概率提供对字符的唯一编码 ...
- 【编译原理】课程实验——基于Java的词法分析与语法分析
⭐⭐⭐⭐⭐⭐ Github主页
- 编译原理2-Bison语法分析
ps:补上了图 实验要求 了解 Bison 基础知识和理解 Cminus-f 语法(重在了解如何将⽂法产⽣式转换为 Bison 语句) 阅读 /src/common/SyntaxTree.c ,对应头 ...
- sql注入pythonpoco_SQL注入原理与解决方法代码示例
一.什么是sql注入? 1.什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网 ...
- 编译原理:词法分析实验报告
词法分析实验报告 文章目录 词法分析实验报告 一.实验目的 二.实验原理 三.实验要求 四.实验步骤(利用Java语言来进行词法分析) ① 待分析的语言词法 ② 单词符号对应的种别码 ③ 词法分析程序 ...
- 编译原理词/语法分析
效果: 代码: 1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: usi ...
- 编译原理之语法分析(自底向上)(包含源码)
编译器之语法分析 自底向上 基本概念 算符优先 SLR 规范LR LALR 自底向上 基本概念 自底向上形成语法树的过程就是及逆行归约,将一堆单词串放在一起,形成某个产生式的样子,然后规约成某个产生式 ...
- 算符优先文法编写java语法分析器,编译原理课程设计实验报告——基于算符优先分析方法的表达式语法分析器...
内容简介: 一.设计目的 了解用算符优先法对表达进行语法分析的方法,掌握自顶向下的预测语法分析程序的手工构造方法. 二.设计内容 对简单表达式文法构造算符优先分析器. 三.设计要求 1.对下列简单表达 ...
最新文章
- Python 字典(Dictionary) get()方法
- 使用抽象等设计工具创建一个稳固的核心机制
- python工作招聘-爬了招聘网站之后,给你几点学习Python的建议
- Atcoder AGC031B Reversi (DP计数)
- 【Python】Pandas中的宝藏函数-transform()
- mysql存储过程并行_Mysql存储过程的执行顺序问题
- rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问
- cmd执行sql文件路径 oracle_oracle 基础 执行sql文件
- mac安装go语言环境
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
- 人跟人的格局真的是不一样的
- model Ensemble
- FOSCommentBundle功能包:指南索引页
- python json解释器_Python JSON
- js自动弹窗被拦截 html,JS打开新窗口防止被浏览器阻止的方法
- eeglab基础学习
- Codeforces 831 A Unimodal Array
- 计算机一级常用英语缩写,电脑常用英文单词和缩写
- pandas.melt()详解
- emacs下安装eaf
热门文章
- R语言_根据马科维茨投资组合理论画出最优投资组合线
- 0-12V的模拟量隔离模块的一些感悟
- Django笔记十一之外键查询优化select_related和prefetch_related
- 读书·2018(14本)
- 拥有“中国诺贝尔奖”的未来论坛,会告诉我们怎样的未来? | 未来论坛 2017...
- 计算机设计大赛参赛作品——疫情看板
- 故障:笔记本开机时自动打开 NumLock 键
- 电脑开机显示自动修复失败无法进入系统,解决方法(亲试有效!!!)
- 【预测模型】预测某地区未来 10-20 年按年龄划分的人口结构(PDE模型)
- HDU4699 Editor(双栈对弹)