解决方案 我遇到一个问题,例如 i = ary [4];
lex打印出“ ary”,但是yacc由于某种原因打印出“ [”,这意味着yytext被某种方式覆盖。
有人可以告诉我如何解决此问题吗?我一拿出
PStmt : Id '[' Expr ']' { $$ = doRary($1, $3); };
然后我的程序没有问题,但是我无法再读取数组。
在我的lex文件中,我有:
{letter}({letter}|{digit})* { return Ident; }
{digit}{digit}* { return IntLit; }
...
\[ { return '['; }
\] { return ']'; }
...
[更新:我必须删除此部分] 在我的yacc文件中,我有:
我将不胜感激有关如何处理此问题的任何提示/解决方案,因为上述声明似乎会影响语法的其他部分。
仅供参考:我正在遵循C优先级规则。
答案 0 :(得分:1)
yytext
是一个内部缓冲区,属于(f)lex生成的扫描程序,并且在每次调用yylex()
时都会修改其内容。野牛/ yacc生成的解析器在无法预测的时刻调用yylex()
。特别是,它将调用yylex()
以获得前瞻性令牌,该令牌不属于当前产品。
因此,yytext
不应在词法分析器操作之外使用。如果解析器需要扫描的令牌的字符串值,则该令牌的lexer操作必须复制yytext并将其存储到yylval
的适当成员中,以便在涉及该解析器的解析器操作中可用令牌。 (有关更多详细信息,请参见bison manual。)
另请参阅this question和许多其他内容。