我的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美元,这应该是理想的
答案 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 { ... }