符号表和类型系统的代码实现

2024-04-30 22:48

本文主要是介绍符号表和类型系统的代码实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节讲解符号表和类型系统的代码实现,该文档只有结合代码调试视频一起看才容易理解,演示视频的地址为:
http://study.163.com/course/courseMain.htm?courseId=1002830012

前几节,我们讨论的符号表和类型系统的基本原理,这一节,我们看看如何从代码上实现前面我们探讨的内容,毕竟,实践才是检验真理的唯一标准,我们仍然基于前面说过的声明语句:

long int *x, y;

看看,在对该语句的语法解析过程中,如何构造相应的符号表,以及对变量x,y构造他们的类型系统。我们将重走一遍上面语句的语法解析流程,在解析过程中,我将把符号表和类型系统的实现逻辑穿插其中。

语法解析流程及符号表和类型系统的实现

1:解析器首先做一次shift操作,将long读入,然后返回一个TYPE标签。
2: 通过 type_specifier -> TYPE, 进行一次reduce操作,此时,我们生成一个Specifier对象,这样,在解析堆栈顶部的是非终结符type_specifier,在属性堆栈上,对应的是Specifier对象:
这里写图片描述

上图左边对应的是解析堆栈,右边对应的是属性堆栈。

3: 接着是根据表达式type_or_class -> type_specifier, specifiers->type_or_class, 连续进行两次reduce操作,这两次reduce不需要进行任何操作,只需要把第一次生成的Specifier对象传达到相应属性堆栈上就可以,于是,这两次reduce后,解析堆栈和属性堆栈的对应关系如下:
这里写图片描述
4:读取int, 进行一次shift操作,把int对应的标签TYPE,传入解析器.
5:根据type_specifier->TYPE,做一次reduce操作,同时生成对应的Specifier对象, 于是解析堆栈和属性堆栈情形如下:
这里写图片描述
6: 接着根据表达式type_or_class -> type_specifier, 做reduce操作,同时把前一步骤的Specifier对象传入属性堆栈的对应位置:
这里写图片描述
7: 根据表达式表达式 specifiers ->specifiers type_or_class 做reduce操作,这次reduce的同时,我们需要将生成的两个specifier合成一个,完成后解析堆栈和属性堆栈的情况如下:
这里写图片描述
8: 根据opt_specifiers -> specifiers 做一次reduce操作:
这里写图片描述
9:接下来是连续两次shift操作,把*对应的标签START和变量x对应的标签NAME,依次读入解析器。
10:根据表达式 new_name -> NAME, 进行reduce操作,同时生成一个Symbol对象
这里写图片描述
10. 根据表达式var_decl -> new_name 进行reduce操作,这次操作不生成新的对象,只是把上面生成的symbol对象转移到对应的属性堆栈:
这里写图片描述
11:接下来是根据表达式 var_decl -> STAR var_decl做reduce操作,此时由于遇到表示指针的*号,因此要生成一个Declarator对象:

这里写图片描述
12: 根据表达式ext_decl->var_decl, ext_decl_list->ext_decl 做reduce操作:
这里写图片描述
13: 读入逗号,将其对应的标签输入解析器
14: 读入变量y, 将它对应的标签NAME, 读入解析器
15: 像读入x时,一样,生成对应的Symbol对象,然后根据表达式var_decl->new_name, ext_decl->var_decl 进行reduce操作后,堆栈情形如下:
这里写图片描述
16: 根据表达式 ext_decl_list -> ext_decl_list COMMA ext_decl 进行reduce,由于x, y属于同一个作用域,因此此时要将x ,y 对应的Symbol对象连接起来:
这里写图片描述
17:读入分号,并把它的Token输入解析器
18: 根据表达式ext_def->opt_specifiers ext_decl_list SEMI 做reduce操作,此时,把最早创建的Specifier加入到每个Symbol 对象的类型列表中:
这里写图片描述
然后再把Symbol队列中的每一个Symbol对象添加到符号表中,那么整个符号表和类型系统的建立过程就算结束了。

具体的代码解说和调试演示过程请看视频:
http://study.163.com/course/courseMain.htm?courseId=1002830012

这篇关于符号表和类型系统的代码实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950123

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取