打印出特定令牌类型的所有实例

Print out all the instances of a particular token type

在 运行 yyparse 之后,我想打印出输入中找到的所有 VARNAME。我对 yacc 变量的内部结构知之甚少,不知道去哪里找,而且 google 没有发现任何明显的东西。

我可以修改 bison 规则以使用 C vars 跟踪这些标记,因为标记一个接一个地出现,但是为了代码清晰的原因,如果所有这些都可以在解析。

basic.l:

[A-Za-z_][A-Za-z0-9_]*$? {
          yylval.s = yytext;
          return VARNAME;
}

basic.y:

%union {
  double d;
  GString *s;
}
%token <s> VARNAME

variable: VARNAME
{
  variable_t *new = malloc(sizeof(*new));
  new->name = ;
  $$ = new;
}

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

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

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

内容的副本

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