Yacc Yytext是否被覆盖?

问题描述 投票:0回答:1

帖子下方评论中提到了解决方案我遇到一个问题,例如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优先级规则。

c yacc lex
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.