【编译系统02】编译器 - 语义分析器(semantic)的简单设计思路(变量类与变量表)
当我们分析到 "int n;",说明其已经定义了一个变量,之后又遇到一个 "n=3",我们从哪里去找这个n并且赋值呢?
答案是:通过我们定义的 变量表(Table) 中查找。

其实,这变量声明定义与变量赋值一系列动作,都是由语义分析器负责的。
1. 当扫描到一个声明语句,比如 "string x;" 时:
1)在语法分析中,当检测到 string <type>,其会将 (string,x)保存在(tVar.type,tVar.name)。
2)调用 Table.addVar ,该函数会生成一个新的 变量对象(var_record),然后添加进 map<> 中。
3)当之后遇到 x = ''hello world"时,其会调用 Table.getVar(x),然后将其赋值为 "hello world",这样就实现了赋值。
2. var_record类定义如下():
class var_record {
public:
symbol type; // 类型
string name; // 名称
// 变量值
int intVal; // 整数
string strVal; // 字符串
int localAddr; // 局部变量相对于ebp指针的地址,或者临时string的索引地址
var_record(); // 默认构造函数
void init(symbol dec_type, string dec_name); // 声明初始化函数
var_record(const var_record& v);//拷贝构造函数
~var_record();
};
1)变量值一开始打算使用 union{int,string} 来实现,但在c++union作为类,存在权限访问冲突(暂时没解决),因此就分开来实现。
3. Table 变量表的定义如下:
class Table {
map<string, var_record*> var_map; // 变量声明列表
public:
Table(); // 构造函数
void addVar(); // 添加变量声明记录,默认使用tvar
// 该函数估计暂时用不到
//void addVar(var_record*v); // 添加变量声明记录,重载(赋值已声明的变量后则要实现重载)
var_record * getVar(string name); // 获取已经记录的变量名
};
1)Table类核心就是围绕map<>结构来建立
2)两个方法,一个是添加变量,另一个是找到变量。
4. 简单的测试代码(模拟"遇到字符串与数字的定义赋值与输出")
#include "pch.h"
#include "semantic.h"
#include <iostream>
#include <string>
#include <map>
using namespace std; map<string, int> a; /*
模拟变量声明过程
int a;
a = 3;
*/ int main() {
// 建立一个全局变量表 Table VarTable; // int a;
tVar.type = NUM; // 变量类型是 NUM(INT) 数字类型
tVar.name = "a"; // 添加变量名
VarTable.addVar(); // 其默认将tVar 添加进表中 // a = 3;
var_record * a = VarTable.getVar("a"); // 拿出变量a
a->intVal = ; // 将a 赋值为 3 // 输出结果
// cout << a << endl
cout << VarTable.getVar("a")->intVal << endl; // string x;
tVar.type = STR; // 变量类型是 NUM(INT) 数字类型
tVar.name = "x"; // 添加变量名
VarTable.addVar(); // 其默认将tVar 添加进表中 // x= "hello world";
var_record * x = VarTable.getVar("x"); // 拿出变量x
x->strVal = "hello world"; // 将a 赋值为 3
int tt =; cout << VarTable.getVar("x")->strVal << endl;
return ;
}

测试结果符合要求。
【编译系统02】编译器 - 语义分析器(semantic)的简单设计思路(变量类与变量表)的更多相关文章
- 04.从0实现一个JVM语言系列之语义分析器-Semantic
从0实现JVM语言之语义分析-Semantic 源码github, 如果这个系列文章对您有帮助, 希望获得您的一个star 本节相关语义分析package地址 致亲爱的读者: 个人的文字组织和写文章的 ...
- 语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet,语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类;目标检测只有两类,目标和非目标,就是在一张图片中找到并用box标注出所有的目标.
from:https://blog.csdn.net/u012931582/article/details/70314859 2017年04月21日 14:54:10 阅读数:4369 前言 在这里, ...
- 基于ARM处理器的反汇编器软件简单设计及实现
写在前面 2012年写的毕业设计,仅供参考 反汇编的目的 缺乏某些必要的说明资料的情况下, 想获得某些软件系统的源代码.设计思想及理念, 以便复制, 改造.移植和发展: 从源码上对软件的可靠性和安全性 ...
- 通过微软的HTML Help Workshop 利用.html文件 生成简单的chm帮助类的文件
1.下载并安装Microsoft HTML Help Workshop 下载链接:http://www.microsoft.com/en-us/download/details.aspx?id=211 ...
- 简单的php Mysql类(查询 删除 更新)
php Mysql类一般都包括了几乎我们常用的数据库操作方法,这里只提供了查询 删除 更新三种操作,算不是很全只是一个简单的数据库查询类了. 代码如下 复制代码 class mysql { ...
- ASP.NET MVC 4 插件化架构简单实现-思路篇
用过和做过插件的都会了解插件的好处,园子里也有很多和讨论,但大都只些简单的加载程序集什么的,这里主要讨论的就是使用 ASP.NET MVC 4 来实现每个插件都可以完全从主站点剥离出来,即使只是一个插 ...
- java使用注解和反射打造一个简单的jdbc工具类
a simple jdbc tools 如有转载和引用,请注明出处,谢谢 1. 定义我们需要的注解 要想实现对数据库的操作,我们必须知道数据表名以及表中的字段名称以及类型,正如hibernate 使用 ...
- GCD实现简单的单例类-Singletion
什么是单例模式 1.单例模式是一个类在系统中只有一个实例对象.通过全局的一个入口点对这个实例对象进行访问.在 iOS 开发中,单例模式是非常有用的一种设计模式.如 下图,是一个简单单例模式的 UML ...
- 一个简单的例子说明windows环境变量配置
关于win下环境变量的问题 配置环境变量其实就像是创建一个快捷键一样,我们把安装程序的路径告诉系统环境变量,这样下次我们在命令行中就可以直接使用一个简单的命令来调用我们安装的程序,因为此时计算机已经知 ...
随机推荐
- django基础之day04,聚合查询和分组查询
聚合查询: 聚合函数必须用在分组之后,没有分组其实默认整体就是一组 Max Min Sum Avg Count 1.分组的关键字是:aggretate 2.导入模块 from django.db.mo ...
- ES6对正则的改进(简要总结)
文章目录 正则的扩展 1. RegExp 构造函数 2. 字符串的正则方法 3. u 修饰符 4. y 修饰符 5. sticky 属性 6. flags 属性 7. s 修饰符:dotAll 模式 ...
- SpringBoot微服务电商项目开发实战 --- 模块版本号统一管理及Redis集成实现
上一篇文章总结了基于SpringBoot实现分布式微服务下的统一配置.分环境部署配置.以及服务端模块的分离(每一个提供者就是一个独立的微服务).微服务落地.Dubbo整合及提供者.消费者的配置实现.本 ...
- div拖拽效果 JQuery
<!DOCTYPE html> <html> <head> <meta name="description" content=" ...
- MySQL 有关MHA搭建与切换的几个错误log
1:masterha_check_repl 副本集方面报错 replicates is not defined in the configuration file! 具体信息如下: # /usr/l ...
- React: 研究Flux设计模式
一.简介 一般来说,State管理在React中是一种最常用的实现机制,使用这种state管理系统基本可以开发各种需求的应用程序.然而,随着应用程序规模的不断扩张,原有的这种State管理系统就会暴露 ...
- swoole如何使php永久运行
有需要学习交流的友人请加入交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群jq.qq.com soole可以通过开启守护进程使PHP永久运行. 守护进程化.设 ...
- CentOS7安装ffmpeg
首先在官网http://ffmpeg.org/download.html下载ffmpeg-4.2.1.tar.bz2 以下为安装步骤: 1.使用工具将源码包上传至Linux主机 2.解压源码包 进入该 ...
- js 日期时间的格式化
将日期时间转换为指定格式,如:YYYY-mm-dd HH:MM表示2019-06-06 19:45 function dateFormat(fmt, date) { let ret; let opt ...
- C# 程序一个cmd命令窗口执行多条dos命令
1,前几天的项目要用到程序执行dos命令去编译已生成的ice文件,后来去百度了好多都是只能执行一条命令 或者是分别执行几条命令,而我要的是一条dos命令在另一台命令的基础上执行.而不是分别执行. 后来 ...