打印出特定令牌类型的所有实例
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 文件复制而来的,我强烈建议您寻找其他型号。该代码几乎可以肯定不起作用,因此它表明没有进行过重要的测试。
在 运行 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 文件复制而来的,我强烈建议您寻找其他型号。该代码几乎可以肯定不起作用,因此它表明没有进行过重要的测试。