语义分析- 符号表

2023-11-18

符号表

1、用来存储程序中的变量相关信息

  • 类型
  • 作用域
  • 访问控制信息
  • ......

2、必须非常高效

  • 程序中的变量规模会很大

符号表的接口

#ifndef TABLE_H
#define TABLE_H
typedef ... Table_t;  // 数据结构

// 新建一个符号表
Table_t Table_new();

// 符号表的插入
void Table_enter (Table_t, Key_t, value_t);

// 符号表的查找
Value_t Table_lookup (Table_t, Key_t);

#endif

注:符号表的具体数据结构我们下面给出。 

符号表的典型数据结构

符号表是典型的字典结构:symbolTable:key-> value

一种简单的数据结构定义(概念上的): 

typedef char *key ;   // 关键字
// key映射到值可能不止一种,比如类型、作用域等
// 所以一般将Value组织成结构体
typedef struct value{ // value中的字段为要维护的变量上的各种信息
    Type_t type ;
    scope_t scope ;
    
    //必要的其他字段
}value;

符号表的高效实现

  • 为了高效,可以使用哈希表等数据结构来实现符号表,查找是O(1)时间
  • 为了节约空间,也可以使用红黑树等平衡树,查找是O(lg N)时间

符号表实现时需关注的点

作用域

我们来看下面这段程序

int x;
int f()
{
    if (4) {
        int x;
        x = 6;
    }
    else {
        int x;
        x = 5;
    }
    x = 8;
}

符号表处理作用域的方法

方法一:一张表的方法(hash表)

进入作用域时,插入元素。

退出作用域时,删除元素。

实现正确的变量屏蔽,需要对hash表做仔细的处理。比如,hash表是一个数组,当在某一个位置发生冲突时,若采用拉链法解决冲突的话,需要保证后面插入的x要插入在表头上面,想一下为什么在这儿用头插法,而不是尾插法?因为要访问最近作用域的变量呀hh~。

方法二:采用符号表构成的栈

进入作用域时,插入新的符号表。

退出作用域时,删除栈顶符号表。

名字空间

在一个程序中,有可能许多地方用到同一个变量名,但是这些变量名的作用是不一样的,他们可以同时存在。如下面这段程序:

struct list
{
    int x;
    struct list *list;
} *list;

void walk(struct list *list)
{
    list:
        printf("%d\n", list->x);
        if (list == list->list)
            goto list;
}

该程序中虽然有多个list,但每个list属于不同的分类。 

① 结构体的名字 ② 变量名 ③ 结构体的域(结构体中的*list域)④ 标号(label)

那么做语义分析时如何处理这种情况呢?

用符号表处理名字空间

每个名字空间用一个表来处理,以C语言为例,有不同的名字空间:变量、标签、标号......

可以每一类定义一张符号表。当变量使用时,需要根据变量类别的不同,到不同的符号表中去查找这个变量。

上面说的,用hash表或栈的方式来组织符号表,是指具体的每一种符号表该怎么来做。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

语义分析- 符号表 的相关文章

  • asp:repeater 折叠表行 - 已更新

    我想知道是否有人对我的问题有创造性的解决方案 我有一个从我的数据库填充的转发器 如下所示
  • 使用遗留代码(使用reinterpret_cast)真的是一种很好的技术吗?

    下面的代码来自一篇关于C 面试问题的帖子here https www toptal com c plus plus interview questions 我从来不知道这种技术 尽管它声称是一种很好的技术 我的问题是 什么情况下需要使用它
  • 全局变量不好

    好吧 读完这篇文章和一些示例后 我仍然不清楚全局变量的含义 那么你的类中的私有变量是全局的吗 http www c2 com cgi wiki GlobalVariablesAreBad http www c2 com cgi wiki G
  • C++ STL 映射,std::pair 作为键

    这就是我通过地图定义的方式 std map
  • MVVM:来自 FileOpenPicker 的图像绑定源

    我将 OnActivated 添加到 app xaml cs 中 它可以正常工作 protected async override void OnActivated IActivatedEventArgs args var continua
  • 如何反序列化 XML 文档

    如何反序列化此 XML 文档
  • 如何将 dll 中包含的组件嵌入到 exe 中,以便它可以从内存运行?

    我正在尝试制作一个必须从内存运行的程序 通过Assembly Load bin 如上所述here http www codeproject com Articles 13897 Load an EXE File and Run It fro
  • 如何在单例类和未命名类之间进行选择?

    我会使用这样的单例 Singleton single Singleton instance single gt do it 我会使用这样的未命名类 single do it 我觉得单例模式除了具有可读的错误消息之外 与未命名的类相比没有任何
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • R 包与 Rcpp 的链接错误:“未定义符号:LAPACKE_dgels”

    我正在创建一个 R 包 lapacker 以使用 R API 头文件 R ext Lapack h 为 R 提供和使用的内部 LAPACK 库 仅具有双精度和双复数 提供 C 接口 源代码 https github com ypan1988
  • 如何在 Windows 上的 GCC 中链接 CS50 C 库

    我是 编程新手 一直在尝试使用以下命令编译我的代码MinGW https en wikipedia org wiki MinGW GCC 但我尝试包括CS50 https en wikipedia org wiki CS50 cs50 c
  • 为什么 xcode IDE 认为 `friend` 是保留字

    我一直在开发一个个人项目 并在我创建的新类中包含以下代码 property readonly getter isFriend BOOL friend 它似乎没有任何问题 当我构建它时 它可以编译得很好 但是当我们在xcode IDE看起来像
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 结构大小与 typedef 版本不同?

    我的代码中有以下结构声明和 typedef struct blockHeaderStruct bool allocated unsigned int length typedef struct blockHeaderStruct block
  • TCP/IP 传输期间套接字数据损坏

    当我通过预连接的 TCP IP 套接字发送数据时 我发现数据已损坏 Example Station1 正在向 Station2 发送数据 我已经在发送之前 在 S1 和接收之后 在 S2 打印了数据 以下是消息 S1 发送的数据是ACKS2
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • 对 Action 方法的两个并行 ajax 请求排队,为什么?

    我正在使用 ASP NET MVC 开发一个视频网站 我希望在我的应用程序中拥有的一项功能是转码视频 但由于转码过程可能非常耗时 我想向客户端用户展示该过程的进度 因此 我的架构是使用一个控制器操作来处理整个转码过程 并将其进度写入存储在服
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web

随机推荐

  • 全球及中国可穿戴医疗设备市场潜力分析与投资动态调研报告2022-2028年

    全球及中国可穿戴医疗设备市场潜力分析与投资动态调研报告2022 2028年 修订日期 2022年2月 出版单位 鸿晟信合研究院 对接人员 周文文 内容分析有删减 了解详情可查看咨询鸿晟信合研究院专员 目录 第一章 可穿戴医疗设备行业相关概述
  • VS2019或者VS2017创建ASP.NET项目

    最近在学 NET Web应用程序开发 做个记录 默认大家的本机的IIS服务已经搭建好了 没有搭建好的自行百度 文章目录 首先是VS的相关配置 然后是项目的创建 发布网站 项目的发布 IIS配置 一 首先是VS的相关配置 首先打开VS2019
  • C# 获取本地主机IP地址

  • 数据库----------唯一约束、默认约束、零填充约束

    目录 1 唯一约束 Unique 1 概念 2 语法 3 添加唯一约束 4 删除唯一约束 2 默认约束 default 1 概念 2 语法 3 添加默认约束 4 删除默认约束 3 零填充约束 zerofill 了解即可 1 概念 2 操作
  • R语言基础

    专注系列化 高质量的R语言教程 推文索引 联系小编 付费合集 本篇总结一些关于工具包的问题 所指的 工具包 对应的英文原文是package s 本篇目录如下 1 工具包简介 2 安装工具包 2 1 CRAN 2 2 GitHub 2 3 离
  • SQL注入——DNSLOG注入

    SQL注入 DNSLOG注入 SQL注入 DNSLOG注入 SQL注入 DNSLOG注入 一 原理 一 原理 当我们遇到盲注漏洞的时候 注入过程没有回显 手工测试会花费大量的时间 如果用sqlmap跑数据的话 实际应用中很可能被目标服务器直
  • 如何在PyCharm中对自己的pySC2 Agent代码进行Debug

    PySC2环境在Win10系统上的部署与安装 请参考 https blog csdn net qq 38962621 article details 112798659 spm 1001 2014 3001 5501 PySC2自定义Age
  • docker单机编排工具docker-compose

    编排工具安装 本文为在linux系统中操作 首先是安装epel源 然后安装python的pip组件 利用pip安装docker compose 在安装完毕后 可以使用查看版本命令以及帮助命令查看所支持的子命令 wget O etc yum
  • CRM管理软件有哪些?这5款好用的CRM软件值得推荐!

    CRM软件最常在销售部门实施 作为销售人员自动化的中心枢纽 包括联系人 客户和机会管理 CRM软件通常与其他企业解决方案 例如ERP系统 营销自动化软件和客户服务软件 分开交付 但通常与其他业务应用程序集成以促进增强和协调的客户体验 目前市
  • 嵌入式常用通讯协议1(UART 、RS232、RS485、SPI、IIC)

    目录 1 常用通讯协议汇总 2 常见的电平信号及其电气特性 2 1 TTL电平 2 2 CMOS电平标准 2 3 RS232标准 2 4 RS485标准 3 UART 通用异步收发器 协议 3 1 UART定义 3 2 UART作用 3 3
  • LeetCode刷题C++

    5 最长回文字符串 给你一个字符串 s 找到 s 中最长的回文子串 划定步长 遍历判断 class Solution public string longestPalindrome string s if s size lt 2 retur
  • Vue 引入G2图表

    安装G2依赖 npm install antv g2 npm install antv data set vue ge 在Vue main js文件中引入G2 import G2 from antv g2 Vue use G2 模板中使用完
  • 深入理解链表:一种动态的线性数据结构

    文章目录 前言 1 概述 2 单向链表 3 单向链表 带哨兵 4 双向链表 带哨兵 5 环形链表 带哨兵 6 结语 前言 链表是我们在日常编程中经常使用的一种数据结构 它相比于数组具有更好的动态性能 但是 对链表的深入理解需要我们掌握其内在
  • Linux项目自动化构建工具-make/Makefile (●‘◡‘●)

    目录 1 为什么要使用make 2 makefile的基本语法与变量 1 为什么要使用make 假设我们的执行文件里面包含2个源文件 分别是main c test c 如果想要这个程序运行起来 那么就需要先编译 先对源文件进行编译 产生te
  • C语言之基本数据类型

    在学习C语言的时候 我们可能首先面对的就是C语言中基本的数据类型 下面来看一下C语言中一些基本的数据类型 基本数据类型 void 声明函数无返回值或无参数 声明无类型指针 显示丢弃运算结果 C89标准新增 char 字符型类型数据 属于整型
  • C++(22)——容器的迭代器失效问题

    前言 我们在之前的学习中已经实现过list和vector的迭代器 那么在面试中经常会有面试官问到有关于迭代器的失效问题 那么为什么迭代器会失效呢 原因 随着VS版本的迭代 g 版本的迭代 C 标准库容器以及迭代器的源码都有比较大的修改 但是
  • js实现图片文件上传预览

    普通的上传图片选择图片后并不知道自己选择的什么图片 那么通过js我们可以做出预览效果这样就知道选择的什么图片 以免误上传
  • 【Detectron2】Not compiled with GPU support 【maskrcnn】

    直接上报错的图 前提条件 检查了cuda is available 和CUDA HOME为True 解决方案 conda install c pytorch pytorch nightly cuda100 我的cuda为cuda10 0 安
  • 7.Springboot集成Redis

    感谢秦疆老师的redis视频教程 更多了解哔哩哔哩搜索 狂神说Java 本文内容源于秦疆老师的redis视频教程 给狂神推荐 点赞吧 SpringBoot整合 SpringBoot操作数据 spring data jpa mongodb r
  • 语义分析- 符号表

    符号表 1 用来存储程序中的变量相关信息 类型 作用域 访问控制信息 2 必须非常高效 程序中的变量规模会很大 符号表的接口 ifndef TABLE H define TABLE H typedef Table t 数据结构 新建一个符号