首页 > 解决方案 > 打印出特定令牌类型的所有实例

问题描述

运行后,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;
}

标签: bison

解决方案


(f)lex 和 yacc/bison 都不会在令牌被消耗后(通过减少操作)尝试保存令牌。如果你想保存它们,你需要自己做。

我通常在词法分析器中执行此操作,方法是将每个 ID 标记添加到一个内部字符串表(即散列集)中。这使得存储管理更容易,因为我可以在解析完成后从哈希表中删除所有字符串。它还避免了不必要的重复字符串副本。

请注意,您不能安全地yytext在 yacc/bison 操作中使用;因此,如果您的解析器需要引用具有多个可能字符串值的令牌的文本值,您的扫描器必须制作(或重用)yytext.

如果您的扫描仪中的代码是从您在 Internet 上找到的某个 (f)lex 文件中复制的,我强烈建议您找到其他型号。该代码几乎可以肯定不起作用,因此它表明从未进行过任何重要的测试。


推荐阅读