语义分析- 符号表

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(使用前将#替换为@)

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

随机推荐

  • 全球及中国可穿戴医疗设备市场潜力分析与投资动态调研报告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 数据结构 新建一个符号