Yacc Yytext是否被覆盖?

时间:2019-12-01 02:46:12

标签: c yacc lex

帖子下方的评论中提到了

解决方案 我遇到一个问题,例如 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优先级规则。

1 个答案:

答案 0 :(得分:1)

yytext是一个内部缓冲区,属于(f)lex生成的扫描程序,并且在每次调用yylex()时都会修改其内容。野牛/ yacc生成的解析器在无法预测的时刻调用yylex()。特别是,它将调用yylex()以获得前瞻性令牌,该令牌不属于当前产品。

因此,yytext不应在词法分析器操作之外使用。如果解析器需要扫描的令牌的字符串值,则该令牌的lexer操作必须复制yytext并将其存储到yylval的适当成员中,以便在涉及该解析器的解析器操作中可用令牌。 (有关更多详细信息,请参见bison manual。)

另请参阅this question和许多其他内容。