You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bison字符串字面量令牌存储位置及Flex遍历方法问询

Bison字符串字面量令牌的存储机制问题

问题说明

我在myparser.y中定义了如下令牌:

%token FOR
%token TO "->"

现有两个疑问:

  • 第一行是否会把字符串"FOR"存入yytname,系统生成的编号(比如257)存入yytoknum?
  • 第二行里"TO"存入yytname、编号258存入yytoknum后,字符串字面量"->"存在哪里?我找不到对应的存储向量,想在Flex扫描器中遍历这些字面量该怎么实现?

解答

第一个疑问的确认

你的理解完全正确。对于%token FOR这种不带字面量的定义:

  • 令牌名FOR会被存入yytname数组,数组索引和yytoknum里的编号(一般从257开始,因为ASCII字符占0-255)一一对应;
  • yytoknum数组存储的就是每个令牌的编号,比如FOR对应的就是257。

字面量"->"的存储与Flex遍历实现

Bison不会把"->"这类字面量存入公开的全局数组(比如yytname),而是会生成内部映射表用于解析时匹配输入和令牌。要在Flex中获取或遍历这些字面量,有两种可行方式:

方式1:手动同步字面量定义

直接在Flex文件中手动添加对应字面量的匹配规则,比如:

"->"    return TO;

这种方式简单直接,但要保证Flex和Bison中的字面量完全一致,避免出现匹配错误。

方式2:通过脚本提取自动生成规则

Bison生成的解析器文件(比如myparser.tab.c)会把字面量硬编码在匹配逻辑里,但不会暴露成可直接遍历的结构。你可以写个简单脚本,从Bison文件中提取所有带字面量的令牌定义(比如匹配%token [A-Z]+ ".*"格式的行),自动生成对应的Flex规则。

另外,用Bison的-d/--defines选项生成的头文件(如myparser.tab.h)只会包含令牌编号和名称,不会带字面量信息,没法直接通过它获取字面量。

内容的提问来源于stack exchange,提问作者Maury Markowitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:57:03