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
相关产品推荐
相关产品推荐

