yacc 输出中的额外右大括号

发布于 2024-11-02 11:44:55 字数 477 浏览 1 评论 0原文

我的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

执着的年纪 2024-11-09 11:44:56

这里:

{word}  {
     yylval = yytext; printf("WORD=%s",yytext); return(WORD);
}

yytext 的值仅在您处理该词素时才有效。一旦移动到下一个词位,缓冲区的内容可能会被覆盖。因此保存 yytext 指针不会给你带来任何好处。您需要将令牌复制出缓冲区。

{word}   {  yylval = (char*)calloc(yylen+1, sizeof(char));
            strncpy(yylval, yytext, yylen); // Remember you need to free this.
            return WORD;
         }

Here:

{word}  {
     yylval = yytext; printf("WORD=%s",yytext); return(WORD);
}

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.

{word}   {  yylval = (char*)calloc(yylen+1, sizeof(char));
            strncpy(yylval, yytext, yylen); // Remember you need to free this.
            return WORD;
         }
温柔一刀 2024-11-09 11:44:56

您可以将 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 (via yylval) in the WORD production. It's just a pointer into the working space of lex. You're seeing the working space change after it parses RBRACE. Imagine a yacc rule like LBRACE 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 { ... }

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文