没有合适的资源?快使用搜索试试~ 我知道了~
07111704_1120173588_鲍吴迪_lab61
需积分: 0 0 下载量 148 浏览量
2022-08-08
17:44:24
上传
评论
收藏 1.59MB DOCX 举报
温馨提示
试读
13页
4.1 校验函数下为通过check()函数检测当前变量是否已定义 4.2 一元表达式校验一元表达式校验是否定义4.3 二元表达式校验二元表达式校验是否定义4.4
资源推荐
资源详情
资源评论
编译原理与设计实验报告
姓名/学号: 鲍吴迪/1120173588
实验名称
语义分析实验
实验目的
(1)熟悉 C 语言的语义规则,了解编译器语义分析的主要功能;
(2)掌握语义分析模块构造的相关技术和方法,设计并实现具有一定分析 功能
的 C 语言语义分析模块;
(3)掌握编译器从前端到后端各个模块的工作原理,语义分析模块与其他 模块
之间的交互过程。
实验内容
语义分析阶段的工作为基于语法分析获得的分析树构建符号表,并进行语义检
查。如果存在非法的结果,请将结果报告给用户,其中语义检查的内容主要包
括:
变量使用前是否进行了定义;
变量是否存在重复定义;
break 语句是否在循环语句中使用;
函数调用的参数个数和类型是否匹配;
函数使用前是否进行了定义或者声明;
运算符两边的操作数的类型是否相容;
数组访问是否越界;
goto 的目标是否存在;
... 本次语义检查的前(1)-(3)为要求完成内容,而其余为可选内容。
实验步骤
1. 对 AST 语法树的遍历
获取到 AST 语法树根结点 program 后,首先编写 SemanticVisitor 类实现
ASTVisitor 接口,然后通过 SemanticVisitor 对象对 program 的子节点进
行访问,从而对其进行深度优先遍历。例如子节点为 FunctionDefine 时:
2. 符号表的建立
采用列表实现符号表的组织与建立,首先创建 TableItem 类,作为符号表
中的项:
name 为变量名/函数名等,
type 为数据类型(如 int),
kind 为声明的种类(如 VariableDeclarator/FunctionDefine),
scope_entry/scope_exit 为其作用域开始/结束位置,
params 仅当该项为函数声明时有作用,列表里包括该函数的每个变量
类型,如 int f(int a,int b);则 params 为[int,int],
sub_table 标识函数内部是否有封闭的子作用域,若存在,则为子作用
域建立新的 table,并加入父作用域的 sub_table 属性中。
符号表为 ArrayList<TableItem>,每个 visitor 有一个独自的符号表
table_0,用 sum_table(类型为 ArrayList< ArrayList<TableItem>>)组
织所有的符号表,其中 sum_table[0]为全局符号表,sum_table[1…n]为每
个函数的符号表。
剩余12页未读,继续阅读
资源评论
WaiyuetFung
- 粉丝: 63
- 资源: 316
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功