当我们分析到 "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)的简单设计思路(变量类与变量表)的更多相关文章

  1. 04.从0实现一个JVM语言系列之语义分析器-Semantic

    从0实现JVM语言之语义分析-Semantic 源码github, 如果这个系列文章对您有帮助, 希望获得您的一个star 本节相关语义分析package地址 致亲爱的读者: 个人的文字组织和写文章的 ...

  2. 语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet,语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类;目标检测只有两类,目标和非目标,就是在一张图片中找到并用box标注出所有的目标.

    from:https://blog.csdn.net/u012931582/article/details/70314859 2017年04月21日 14:54:10 阅读数:4369 前言 在这里, ...

  3. 基于ARM处理器的反汇编器软件简单设计及实现

    写在前面 2012年写的毕业设计,仅供参考 反汇编的目的 缺乏某些必要的说明资料的情况下, 想获得某些软件系统的源代码.设计思想及理念, 以便复制, 改造.移植和发展: 从源码上对软件的可靠性和安全性 ...

  4. 通过微软的HTML Help Workshop 利用.html文件 生成简单的chm帮助类的文件

    1.下载并安装Microsoft HTML Help Workshop 下载链接:http://www.microsoft.com/en-us/download/details.aspx?id=211 ...

  5. 简单的php Mysql类(查询 删除 更新)

    php Mysql类一般都包括了几乎我们常用的数据库操作方法,这里只提供了查询 删除 更新三种操作,算不是很全只是一个简单的数据库查询类了.      代码如下 复制代码 class mysql { ...

  6. ASP.NET MVC 4 插件化架构简单实现-思路篇

    用过和做过插件的都会了解插件的好处,园子里也有很多和讨论,但大都只些简单的加载程序集什么的,这里主要讨论的就是使用 ASP.NET MVC 4 来实现每个插件都可以完全从主站点剥离出来,即使只是一个插 ...

  7. java使用注解和反射打造一个简单的jdbc工具类

    a simple jdbc tools 如有转载和引用,请注明出处,谢谢 1. 定义我们需要的注解 要想实现对数据库的操作,我们必须知道数据表名以及表中的字段名称以及类型,正如hibernate 使用 ...

  8. GCD实现简单的单例类-Singletion

    什么是单例模式 1.单例模式是一个类在系统中只有一个实例对象.通过全局的一个入口点对这个实例对象进行访问.在 iOS 开发中,单例模式是非常有用的一种设计模式.如 下图,是一个简单单例模式的 UML ...

  9. 一个简单的例子说明windows环境变量配置

    关于win下环境变量的问题 配置环境变量其实就像是创建一个快捷键一样,我们把安装程序的路径告诉系统环境变量,这样下次我们在命令行中就可以直接使用一个简单的命令来调用我们安装的程序,因为此时计算机已经知 ...

随机推荐

  1. static介绍、内部类、final、权限修饰符的作用范围

    static 关键字:(可用于修饰方法.变量)     static 特点:         static是静态修饰符,一般修饰成员变量.被static修饰的属于全局共享.被static修饰的成员属于 ...

  2. cannot resolve symbol AppCompatActivity

    记一次配置性的问题 今天复习自定义控件的时候新建一个project,生成的代码冒红,可把我给郁闷了.我知道我的配置是正确的,可是... 它出现了cannot resolve symbol AppCom ...

  3. ChinaSys 一些心得

    这周不要脸的和老板一起去了 ChinaSys,可以说整个中国搞系统最nb的一批人的学术交流了.一圈报告听下来, 有几点心得,不多,可能也没有那么深刻. 系统领域的开源框架并不多 搞系统和搞AI,搞算法 ...

  4. 使用node+express+mongodb实现用户注册、登录和验证功能

    无论是手机端还是pc端,几乎都包含登录注册方面功能,今天就使用node+express+mongodb实现一套登录注册功能,这里需要自己去安装MongoDB环境,如果没有安装可以看这篇关于MongoD ...

  5. Android 上下文菜单 ActionMode

    public class MainActivity extends Activity { private Button button; private ActionMode actionMode; @ ...

  6. 信通院发布《云计算发展白皮书 (2019年) 》 (附PPT解读)

    来源: 中国信息通信研究院CAICT 为了进一步促进云计算创新发展,建立云计算信任体系,规范云计算行业,促进市场发展,提升产业技术和服务水平.由中国信息通信研究院(以下简称“中国信通院”)主办,中国通 ...

  7. .NET Core 发布(dotnet publish)

    目录 一.需求 二.方法 三.参考 一.需求 使用.net core 3.0建的项目,一般情况下,每次想发布都要打开vs,然后点击发布,选择配置: 如果想用cmd命令行发布,应该怎么写呢? 二.方法 ...

  8. abp大文件附件功能视频教程

    视频分享地址:https://share.weiyun.com/5wtofib

  9. CURL命令学习一

    每天学习一点点.... 直接获取页面数据: curl http://www.xxx.com/[可以指定具体的路径获取某个文件] 用户名(密码): curl -u username http://www ...

  10. webpack4配置学习(一)

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency gr ...