在yacc输出中的额外右支撑

时间:2011-04-19 19:39:40

标签: c yacc lex

我的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美元,这应该是理想的

2 个答案:

答案 0 :(得分:3)

下面:

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

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

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

答案 1 :(得分:2)

您可以在yytext制作中存储yylval(通过WORD)的值。它只是指向lex工作空间的指针。在分析RBRACE之后,您看到工作空间发生了变化。想象一下像LBRACE WORD COMMA WORD LBRACE那样的yacc规则以及那里会发生什么。

如果您不想单独制作,我认为您可以LBRACE WORD { code to strdup yylval } RBRACE { ... }