bison学习 - %union声明和%token

%union声明
%union声明标识出了符号值可能拥有的所有C类型。
声明格式如下:

%union {... 域声明 ...
}

域声明将被原封不动的拷贝到输出文件中类型为YYSTYPE的C的union声明里。bison并不检查%union中的内容是否是有效的C代码。
如果你有多个%union声明,它们的内容将会合并成一个C或者C++的联合声明。
如果不存在%union声明,bison将把YYSTYPE定义为int,这样所有的符号值都为整数。
如果你可以通过%type来把%union中声明的类型与特定的符号关联起来。
bison把生成的C的联合声明放在生成的C文件和可选的头文件(除非你另行指定,否则被命名为name.tab.h)中,所以你可以在其它
源文件中通过包含该头文件来使用YYSTYPE。反过来说,你也可以把你自己声明的YYSTYPE放在一个头文件中,然后在定义部分通过
#include来引用它。在这种情况下,你必须至少有一个%type或者其它符号类型声明来告诉bison你在使用显示声明的符号类型。

%token声明
token,或者说终结符,是词法分析器传递给语法分析器的符号。当bison语法分析器需要新的标记时,它调用yylex(),这将从输入
中返回下一个标记。在输入结束时,yylex()返回0。
标记可以是通过%token定义的符号或者是单引号中的各个字符。所有被用来作为标记的符号必须在定义部分显式声明,例如:

%token UP DOWN LEFT RIGHT

标记也可以通过%left,%right,%nonassoc来声明,它们都具有和%token一样的语法选项。

标记编号
在词法分析和语法分析器中,标记通过小型整数来唯一标识。一个文字标记的记号编号就是它在本地字符集(通常是ASCII)中的数值,
而且也与被引起字符的C语言的值一致。
符号标记通常由bison来负责编号,该编号要大于任何可能的字符编码,所以它们不会和文字标记发生冲突。你也可以在%token的标记
名字后直接加上要赋值的编号:

%token UP 50 DOWN 60 LEFT 17 RIGHT 25

给两个标记赋予相同的编号是错误的行为。在大多数情况下,让bison来选择每个标记的编号最简单易懂。词法分析器需要知道标记编号,
以便于能够返回合适的数值给语法分析器。对于文字标记而言,它使用对应的C字符常量。对于符号标记,你可以通过-d命令行标志来让bison
创建一个C的头文件,里面包含所有标记编号的定义。如果你在你的词法分析器中#include这个头文件,你就可以直接在C代码中使用符号记号,
例如,UP,DOWN,LEFT和RIGHT。如果你的源文件是xxx.y的话,你的头文件通常会生成为xxx.tab.h,你也可以通过%defines声明或者
--defines=filename命令行选项来更改它。

%defines "xxxsyms.h"

标记值
bison中的每个符号都可以有关联值。由于标记可以有值,你需要在词法分析器返回标记给语法分析器时来设置值。标记值总是保存在变量
yylval中。在最简单的语法分析器里,yylval就是简单的int变量,你可以在flex词法分析器中做如下设置:

[0-9]+  {yylval = atoi(yytext);return NUMBER;}

不过,在大多数情况下,不同的符号会有不同的值类型。
在语法分析器中,你必须定义所有拥有值的标记的值类型。你只需要把相应的联合类型中的标记名字用尖括号括起,然后放到%token或者优
先级声明中。你可以如下定义你的值类型:

%union {enum optype opval;double dval;
}%nonassoc <opval> RELOP
%token <dval> REAL%union {char *sval;
}...
%token <sval> STRING

在这个例子中,RELOP是一个关系操作符,比如==或者>,而标记值表明具体的操作符。
当你返回标记时,你需要设置yylval中相应的域。本例中,你可以在词法分析器中如下进行设置:

  %{#include "parser.tab.h"%}...[0-9]+\.[0-9]*   {yylval.dval = atof(yytext);return REAL;}\"[^"]*\"        {yylval.sval = strdup(yytext);return STRING;}"=="             {yylval.opval = OPEQUAL;return RELOP;}

REAL的值是一个double类型,所以它被放在yylval.dval中,而STRING的值是char *类型,所以它被放在yylval.sval中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/909727.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

langchain0.3教程:聊天机器人进阶之方法调用

大语言模型只能聊天吗?本篇文章将会介绍OpenAI的Function calling原理,以及在Langchain中对应的Tools Calling如何使用,最后将工具调用集成到gradio实现可视化聊天界面。我们思考一个问题:大语言模型是否能帮我们做更多的事情,比如帮我们发送邮件。默认情况下让大模型帮我…

云锵投资 2025 年 3 月简报

季报摘要加密货币高频量化策略,研发中…… 本季度量化基金策略业绩:4.98%,良,全国排名:3975/12416;平均 Beta:1.00; 本季度量化股票策略业绩:5.04%,良,全国排名:3935/12416;平均 Beta:1.46; 本季度量化期权策略业绩:8.69%(中性策略,不参与全国股基排名);(…

【攻防世界】flag_universe

⭕、知识点 流量分析/ftp协议/图片LSB隐写/zsteg 一、题目给出一个流量包二、解题 1、追踪ftp流量 2、查看后发现一些可能有用的信息3、flag.txt里的内容是一串base64编码后的数据,解密后发现是假flag4、根据题目名称以及剩下的两个文件,盲猜答案就隐藏在两张图片中13号流是旧…

20242317 2024-2025-2 《Python程序设计》实验二报告

20242317 2024-2025-2 《Python程序设计》实验二报告 课程:《Python程序设计》 班级:2423 姓名:林楚皓 学号:20242317 实验教师:王志强 实验日期:2025年3月26日 必修/选修:公选课 一、实验内容 1.设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善; …

# **DeepSeek 深度解析 PasteForm:一个让管理端开发爽到飞起的全栈解决方案**

🤖 DeepSeek 深度解析 PasteForm:一个让管理端开发爽到飞起的全栈解决方案 各位开发者注意啦!今天我要带大家全方位解剖 PasteForm 这个神奇框架——不仅介绍核心思想,更要重点展示它强大的配套工具链!(那些被其他教程忽略的精华部分都在这里了!) 先上镇楼图,这是 De…

利用 AWS Signature:REST API 认证的安全指南

随着云计算领域的不断发展,保护 API 访问的安全性变得愈加重要。AWS Signature 提供了一种强大的机制,用于通过 REST API 认证请求到 AWS 服务。本文讨论了 AWS Signature 的重要性,解释了它是什么,提供了 Java 和 Go 中的实现示例,并介绍了用于测试的工具,包括 APIPost,…

【ABP】项目示例(8)——数据迁移

数据迁移 在上一章节中,已经展示了数据播种的用途之一,即单元测试中进行数据初始化,在这一章节中,实现数据播种的另一重要用途,即数据迁移 该项目使用的是代码优先的开发模式,需要将领域模型迁移到数据库中的数据模型 EF数据迁移 在程序包管理控制台选中General.Backend.…

一个测试工程师的实战笔记:我是如何在Postman和Apipost之间做出选择的?

作为一家金融科技公司的测试负责人,我每天要处理数十个需要加密验签的接口。从最开始的Postman,到后来的Apipost,让我重新思考:我们需要的究竟是一个代码编辑器,还是一个真正懂测试者的智能工具? 一、当加密需求被Postman的脚本支配 1、密码字段MD5加密 去年接手支付系统…

【ABP】项目示例(7)——数据播种

数据种子 在上一章节中,已经对仓储层和应用层进行了单元测试,在这一章节中,进行数据播种 大多数程序正常运行都需要依赖于初始数据,依赖于数据库的程序基本都是如此 例如需要有一个初始的管理员用户或者一个管理员角色,用来进行登录系统,像这种主要用于生产环境中的数据播…

kettle从入门到精通 第九十四课 ETL之kettle MySQL Bulk Loader大批量高性能数据写入

1、在使用kettle时如果对表输出性能要求,可以考虑用mysql 批量加载步骤,该步骤可以实现每秒5万+的数据同步(该数据仅是基于我本人的笔记本,若是服务器则效率更高),如下图所示: 2、原理 知其然知其所以然,之所以MySQL Bulk Loader速度如此之快是因为MySQL 批量加载器使用…

Web开发SpringBoot流程性的学习----回顾补充2(YApi)

Vue简述 Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写。 基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。 Vue2官网:https://v2.cn.vuejs.org/生命周期(Vue3已不同)AJAX 概念: Asynchronous JavaScript And XML,异步的…

4.1日报

今天完善了那个多条件查询 虽然没有做成知网那么高级的 但是查询功能已经很完善// 1. 政策标题精确查询(可根据需求改为like模糊查询)if (StringUtils.hasText(policyTitle)) {queryWrapper.like(Policy::getName, policyTitle);}// 2. 政策内容全文检索if (StringUtils.hasT…