【编译系统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下环境变量的问题 配置环境变量其实就像是创建一个快捷键一样,我们把安装程序的路径告诉系统环境变量,这样下次我们在命令行中就可以直接使用一个简单的命令来调用我们安装的程序,因为此时计算机已经知 ...
随机推荐
- 《Dotnet9》系列-开源C# Winform控件库强力推荐
时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...
- cuckoo沙箱技术分析全景图
从事信息安全技术行业的小伙伴们都知道沙箱技术(有些也称沙盒),用来判断一个程序或者文件是否是恶意的病毒.木马.漏洞攻击exp或其他恶意软件.其原理简单来说就是提供了一个虚拟的环境,把分析目标放到这个虚 ...
- Another git process seems to be running in this repository
今天在推送项目的时候git突然报如题的错误.查了一下是由于git被另外一个程序占用,产生原 原因在于Git在使用过程中遭遇了崩溃,部分被上锁资源没有被释放. 解决方案也很简单,在git中找到对应的in ...
- Support URL
如您有任何疑问或者建议,请通过以下方式与我们取得联系,我们会尽快响应您的反馈: 邮箱:eighteyes_cn@163.com
- 1.Android-入门之系统架构介绍
1.Android 系统架构 android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层,如下图所示: 2.application应用程序层 该层提供一些核 ...
- 局域网地址为什么是192.168.X.X?为什么连上公司的VPN就上不了网?
注:本文主要目的是给程序员讲述一些局域网/VPN的基本知识,并不涉及到具体的实操.关于如何安装VPN服务器.配置VPN客户端及修改Windows路由表等具体实操内容,请自行搜索. RFC 局域网地址为 ...
- wireshark抓包如何查看视频分辨率和码率
本文简单介绍如何查看Wireshark抓取pcap包,其视频码流的分辨率和码率. 查看分辨率 我们打开一个抓取的pcap文件,找到标记为SPS(Sequence Parameter Set)的数据包. ...
- HttpRunner学习2--用例格式和简单使用
前言 HttpRunner中,测试用例支持两种文件格式:YAML 和 JSON.两种格式的用例是完全等价的,对于相同的信息内容,使用 YAML /JSON 得到的测试结果和报告也是一致的. 本人环境: ...
- Linux下设置mysql允许远程连接
最近在Linux上安装了Mysql,然后在Windows环境下通过Navicat来连接时,出现报错:1045 Access denied for user 'root'@'XXX' (using pa ...
- Change Style of Navigation Items 更改导航项的样式
In this lesson, you will learn how to change the style of navigation items in a WinForms XAF applica ...