yacc 输出中的额外右大括号
我的 lex 文件有:
word [^{}"=,\t\n@\\ ]+
\{ {
return(LBRACE);
}
\} {
return(RBRACE);
}
{word} {
yylval = yytext; printf("WORD=%s",yytext); return(WORD);
}
我的 yacc 文件有:
phrase: LBRACE WORD RBRACE {printf("LBRACE %s RBRACE\n",$2);};
输入时:
{FooBar}
我得到:
WORD=FooBar
LBRACE FooBar} RBRACE
我不确定为什么我得到了额外的右大括号,即使我只打印 $2,这应该是理想的
My lex file has:
word [^{}"=,\t\n@\\ ]+
\{ {
return(LBRACE);
}
\} {
return(RBRACE);
}
{word} {
yylval = yytext; printf("WORD=%s",yytext); return(WORD);
}
My yacc file has:
phrase: LBRACE WORD RBRACE {printf("LBRACE %s RBRACE\n",$2);};
On inputting:
{FooBar}
I get:
WORD=FooBar
LBRACE FooBar} RBRACE
I'm unsure why I'm getting the extra right brace even though I'm printing only $2, which should ideal
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这里:
yytext 的值仅在您处理该词素时才有效。一旦移动到下一个词位,缓冲区的内容可能会被覆盖。因此保存 yytext 指针不会给你带来任何好处。您需要将令牌复制出缓冲区。
Here:
The value of yytext is only valid while you are handling this lexeme. Once you move to the next lexeme the content of the bufffer may be overwritten. Thus saving the yytext pointer is not going to do you any good. You need to copy the token out of the buffer.
您可以将
yytext
的值(通过yylval
)存储在WORD
产生式中。它只是指向 lex 工作空间的指针。您会看到工作空间在解析RBRACE
后发生变化。想象一下像LBRACE WORD COMMA WORD LBRACE
这样的 yacc 规则以及那里会发生什么。如果您不想单独制作,我认为您可以执行
LBRACE WORD { code to strdup yylval } RBRACE { ... }
It's up to you to store the value of
yytext
(viayylval
) in theWORD
production. It's just a pointer into the working space of lex. You're seeing the working space change after it parsesRBRACE
. Imagine a yacc rule likeLBRACE WORD COMMA WORD LBRACE
and what would be going on there.If you don't want to have a separate production I think you can do
LBRACE WORD { code to strdup yylval } RBRACE { ... }