当我们分析到 "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. OPCode 详解

    OpCode 操作码(Operation Code, OPCode):描述机器语言指令中,指令要执行某种操作的机器码 OPCode在不同的场合中通常具有不同的含义,例如PHP虚拟机(Zend VM). ...

  2. 一起学Vue之模板语法

    概述 Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTM ...

  3. 【后端C#】后台通过http post 调用 webservice 的方法

    定义http post 调用webservice的某个方法 /// <summary> /// http Post调用 WebService /// </summary> pu ...

  4. MySQL 有关MHA搭建与切换的几个错误log

    1:masterha_check_repl 副本集方面报错  replicates is not defined in the configuration file! 具体信息如下: # /usr/l ...

  5. Mongdb可视化工具Studio 3T的使用

    一.官网地址 https://studio3t.com/ 二.下载和安装 点击DOWNLOAD即可下载 按照自己电脑系统进行选择,然后填写邮箱和选择行业,第一次登录如果不提交不会下载,下载完成是一个z ...

  6. linux部署.net Core项目

    首篇笔记,多多关照.方便回忆和给新手指导,大神绕道 首先在Linux系统部署.net Core项目首先准备一个Linux系统的服务器,百度云,阿里云都行. 1.net core 部署在Linux系统上 ...

  7. H5和ionic RN和Weex 他们之间的比较

    使用H5和ionic 进行移动APp开发 首先要开发一个完整的网站,然后,在网站的基础上,使用 H5+huozhe ionic提供的打包技术,把网站打包成一个应用. 把网站打包成一个可以安装到手机上运 ...

  8. 设置tomcat为自动启动

    第一步:设置tomcat为服务启动项 进入dos窗口,输入service.bat install,启动服务, 这里要注意的是,如果直接在cmd输入报错,需要你进入到tomcat的目录下执行cmd 第二 ...

  9. JVM进入老年代情况

    1.躲过15次GC之后进入老年代 默认的设置下,当对象的年龄达到15岁的时候,也就是躲过15次Gc的时候,他就会转移到老年代中去 这个具体是多少岁进入老年代,可以通过JVM参数 “-XX:MaxTen ...

  10. Delphi CreateProcess 创建一个新的进程和它的主线程

    Delphi CreateProcess WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件 CreateProcess百科名片 WIN32 ...