bison - 打印出特定令牌类型的所有实例
问题描述
运行后,yyparse
我想打印出VARNAME
输入中找到的所有 s。我对 yacc 变量的内部了解不多,不知道去哪里看,而且谷歌也没有发现任何明显的东西。
我可以修改 bison 规则以使用 C 变量来跟踪这些,因为令牌是一个接一个地进来的,但是出于代码清晰的原因,如果所有这些都可以在解析后一次性完成会好得多。
基本的.l:
[A-Za-z_][A-Za-z0-9_]*\$? {
yylval.s = yytext;
return VARNAME;
}
基本的.y:
%union {
double d;
GString *s;
}
%token <s> VARNAME
variable: VARNAME
{
variable_t *new = malloc(sizeof(*new));
new->name = $1;
$$ = new;
}
解决方案
(f)lex 和 yacc/bison 都不会在令牌被消耗后(通过减少操作)尝试保存令牌。如果你想保存它们,你需要自己做。
我通常在词法分析器中执行此操作,方法是将每个 ID 标记添加到一个内部字符串表(即散列集)中。这使得存储管理更容易,因为我可以在解析完成后从哈希表中删除所有字符串。它还避免了不必要的重复字符串副本。
请注意,您不能安全地yytext
在 yacc/bison 操作中使用;因此,如果您的解析器需要引用具有多个可能字符串值的令牌的文本值,您的扫描器必须制作(或重用)yytext
.
如果您的扫描仪中的代码是从您在 Internet 上找到的某个 (f)lex 文件中复制的,我强烈建议您找到其他型号。该代码几乎可以肯定不起作用,因此它表明从未进行过任何重要的测试。
推荐阅读
- css - 无法动态对齐子菜单中的超级子菜单
- vue.js - 创建新的引导表后未重新加载多排序模式
- firebase - 匿名函数导致“在空值上使用空检查运算符”
- android - FCM 在针对 S+ 时不起作用。待处理的意图问题
- javascript - 如何使用 AmCharts 插件中的 PieChart 使“粘性”工具提示可切换?
- google-chrome - 在拆分视图中获取 gmail 的 msg id
- docker - 使用 ES_SETTING_ 在 docker 中使用 discovery.type=single-node 运行 Elasticsearch
- javascript - 如何从包含javascript中多个数组的数组中删除空值?
- python - 将组件方法动态添加到复合类
- java - 如何在 Java 中创建 Github 登录会话?