没有合适的资源?快使用搜索试试~ 我知道了~
语义分析详细设计1
需积分: 0 0 下载量 90 浏览量
2022-08-08
21:56:06
上传
评论
收藏 280KB DOCX 举报
温馨提示
试读
32页
语义分析详细设计1
资源详情
资源评论
资源推荐
语义分析详细设计
一、 语义分析概述
语义分析是编译的第三个阶段,主要完成的任务是建立符号表和类型检
查。在源代码中通常有两种语句:声明语句和可执行语句。
在声明语句中,会声明一些数据对象或过程,并为之取相应的名字,即
标识符;因此对于声明语句,语义分析的主要任务就是收集标识符的属性信
息和语义检查。标识符的属性包括种属(如变量、常量、过程等)、类型
(integer、char 等)以及名称等,通过收集这些信息,语义分析程序会建立
一张符号表,记录源程序中定义的所有记录;而对声明语句的语义检查,则
主要聚焦于是否重定义等;
对可执行语句的语义分析大体可以理解为对可执行语句的语法检查及自
动调整,比如:变量名未声明就使用,函数参数不匹配等情况,并在适当的
时候进行隐式类型转换,以及输出警告信息;
通过语义分析程序,我们可以收集到源程序中出现的所有语义错误,并
建立一张完整的符号表。
二、 接口分析
1. 与语法分析的接口
与语法分析的接口是语法分析树的根节点,即 ParseTreeHead;
Token* ParseTreeHead;
2. AST 生成接口
字符串转整型
函数接口:int str2int(string str);
参数列表
string str :需要转化的字符串
返回值:转化后的 int 值
字符串转浮点型
函数接口:float str2float(string str);
参数列表
string str :需要转化的字符串
返回值:转化后的 float 值
获取整个程序
函数接口:_Program* getProgram(Token *now);
参数列表
Token *now :当前语法分析树节点
返回值:返回 AST 根结点指针_Program 类指针
获取主程序头
函数接口:void getProgramHead(Token *now, pair<string, int>& _programId,
vector< pair<string, int> >& _paraList);
参数列表
Token *now :当前语法分析树节点
pair<string, int>& _programId :主程序名及行号
vector< pair<string, int> >& _paraList :参数名及行号列表
返回值:空
获取主程序体
函数接口:_SubProgram* getProgramBody(Token *now);
参数列表
Token *now :当前语法分析树节点
返回值:子程序体,_SubProgram 类指针
获取标识符列表
函数接口:void getIdList(Token *now, vector< pair<string, int> >& res,bool
reverseFlag);
参数列表
Token *now :当前语法分析树节点
vector< pair<string, int> >& res :标识符名及行号列表
bool reverseFlag :是否反转标识符列表
返回值:空
获取常数值
函数接口:void setConst(Token *now, _Constant* &_constant);
参数列表
Token *now :当前语法分析树节点
_Constant* &_constant :待修改的常量定义
返回值:空
获取常量定义列表
函数接口:void getConstList(Token *now, vector<_Constant*>& _constantList);
参数列表
Token *now :当前语法分析树节点
vector<_Constant*>& _constantList :常量定义列表
返回值:空
获取常量定义
函数接口:void getConst(Token *now, vector<_Constant*>& _constantList);
参数列表
Token *now :当前语法分析树节点
vector<_Constant*>& _constantList :常量定义列表
返回值:空
获取重构定义列表
函数接口:void getTypeDefList(Token *now,vector<_TypeDef*>& _typedefList);
参数列表
Token *now :当前语法分析树节点
vector<_TypeDef*>& _typedefList :重构定义列表
返回值:空
获取重构定义
函数接口:void getTypeDef(Token *now,vector<_TypeDef*>& _typedefList);
参数列表
Token *now :当前语法分析树节点
vector<_TypeDef*>& _typedefList :重构定义列表
返回值:空
获取变量定义列表
函数接口:void getVariantList(Token *now,vector<_Variant*>& _variantList);
参数列表
Token *now :当前语法分析树节点
vector<_TypeDef*>& _typedefList :变量定义列表
返回值:空
获取变量定义
函数接口:void getVariant(Token *now,vector<_Variant*>& _variantList);
参数列表
Token *now :当前语法分析树节点
vector<_TypeDef*>& _typedefList :变量定义列表
返回值:空
获取类型
函数接口:_Type* getType(Token *now);
参数列表
Token *now :当前语法分析树节点
返回值:类型具体定义,即_type 类型指针
获取数组上下界列表
函数接口:
void getArrayRangeList(Token *now,vector< pair<int,int> >& _arrayRangeList);
参数列表
Token *now :当前语法分析树节点
vector< pair<int,int>>& _arrayRangeList:数组各维上下界列表
返回值:空
获取数组上下界
函数接口:
void getArrayRange(Token *now,vector< pair<int,int> >& _arrayRangeList);
参数列表
Token *now :当前语法分析树节点
vector< pair<int,int>>& _arrayRangeList:数组各维上下界列表
返回值:空
获取函数/过程定义列表
函数接口:void getSubprogramDefinitionList(Token *now,
vector<_FunctionDefinition*>& _subprogramDefinitionList);
参数列表
Token *now :当前语法分析树节点
vector<_FunctionDefinition*>& _subprogramDefinitionList :
函数/过程定义列表
返回值:空
获取函数/过程定义
函数接口:_FunctionDefinition* getSubprogramDefinition(Token *now);
参数列表
Token *now :当前语法分析树节点
返回值:子程序定义类指针
获取子程序头
函数接口:
void getSubprogramHead(Token *now,pair<string,int>& functionID,
vector<_FormalParameter*>& _formalParaList,pair<string,int> &_type);
参数列表
Token *now :当前语法分析树节点
pair<string,int>& functionID :子程序名及行号
vector<_FormalParameter*>& _formalParaList :参数列表
pair<string,int> &_type :返回值类型及行号,可能为空串,表
剩余31页未读,继续阅读
ai
- 粉丝: 55
- 资源: 315
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0