从野生动物错误的野牛打印变量

时间:2014-03-16 10:49:53

标签: c bison flex-lexer

所以我有一个看起来像这样的野牛规则:

VAR ID ':' INT '=' intexp ';' {printf("id is '%s'\n", $2);}

我试图使用$ 2

打印'ID'的值

当我输入我的测试代码来解析

var x : int = 5;

野牛正在打印:

id is 'x : int = 5;'

而不是我想要的:

id is 'x'

ID在我的词法分析器中声明为:

 {ID}        { yylval.id = yytext; return ID; }

如果我在这里的词法分析器中执行printf,则yytext的值是正确的('x')

这就是我被困住的地方。使用$ 2打印表达式的其余部分而不仅仅是特定ID,我不知道为什么。任何见解将不胜感激。

1 个答案:

答案 0 :(得分:2)

你必须复制yytext,它是flex的内部缓冲区。

即,而不是

{ID}        { yylval.id = yytext; return ID; }

类似的东西:

{ID}    {yylval.id = malloc(yyleng + 1); strcpy(yylval.id, yytext); return ID;}

显然,它不健壮,因为它不会进行错误检查,你必须处理释放解析器中的内存,而不是在树中结束,并处理将它从树中解放出来等等。但这是基本的想法。