所以我有一个看起来像这样的野牛规则:
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,我不知道为什么。任何见解将不胜感激。
答案 0 :(得分:2)
你必须复制yytext,它是flex的内部缓冲区。
即,而不是
{ID} { yylval.id = yytext; return ID; }
类似的东西:
{ID} {yylval.id = malloc(yyleng + 1); strcpy(yylval.id, yytext); return ID;}
显然,它不健壮,因为它不会进行错误检查,你必须处理释放解析器中的内存,而不是在树中结束,并处理将它从树中解放出来等等。但这是基本的想法。