Parsing yacc/lex的基本问题

Parsing yacc/lex的基本问题,parsing,yacc,lexer,Parsing,Yacc,Lexer,我对一个非常简单的yacc/lex程序有一些问题。我可能忘记了一些基本步骤(我已经很久没有使用这些工具了) 在我的lex程序中,我给出了一些基本值,如: word [a-zA-Z][a-zA-Z]* %% ":" return(PV); {word} { yylval = yytext; printf("yylval = %s\n",yylval); return(WORD); } "\n"

我对一个非常简单的yacc/lex程序有一些问题。我可能忘记了一些基本步骤(我已经很久没有使用这些工具了)

在我的lex程序中,我给出了一些基本值,如:

word    [a-zA-Z][a-zA-Z]*
%%
":"    return(PV);
{word}  { 
            yylval = yytext;
            printf("yylval = %s\n",yylval);
            return(WORD);
       }
"\n"    return(ENDLINE);
在我的yacc程序中,语法的开头是(其中TranslationUnit是我的%start):

当我使用输入运行程序时:

keyword : value
我想我至少会得到:

$1 = keyword
$2 = keyword // yylval not changed for token PV
$3 = value
$4 = value // yylval not changed for token ENDLINE
事实上,我得到:

$1 = keyword : value
$2 = keyword : value
$3 = value
$4 = value
我不明白这个结果。我以前学过语法,即使我现在什么都不记得了,我也没有发现任何重大错误


提前感谢您的帮助。

问题在于,除非您保存令牌,否则Lex/Yacc会继续重写空间,或指向不同的空间等。因此,您需要在修改之前隐藏对您至关重要的信息。您在Lex代码中的打印应该表明
yylval
值在调用lexer(词法分析器)时是准确的


另请参见在何处遇到和诊断了相同的基本问题。

Lex代码中的“{mot}”是指“{word}”吗?哦,是的——你说法语,而且大部分时间都是为我们翻译的。@Jonathan Leffler:是的,很抱歉弄错了。我现在改了。非常感谢你的回答。事实上,我在Lex代码中打印得到了很好的结果。为了解决我的问题,我尝试通过添加一个缓冲区来更改代码:InfoExpression:WORD{memset(buffer,'\0',buffer_LENGTH);sprintf(buffer,'%s',$1);}PV WORD{sprintf(buffer,'%s='%s',buffer,$1);}ENDLINE{printf('%s\n',buffer buffer);};但是通过这次修改,我仍然得到了:keyword='keyword:value'(注释:continued),所以我使用了以下解决方案(可能更干净,但我不知道…):InfoExpression:InfoLValue PV InfoRValue ENDLINE{printf(“%s\n”,buffer);};InfoLValue:WORD{memset(buffer,'\0',buffer_LENGTH);sprintf(buffer,'%s',$1);};InfoRValue:WORD{sprintf(缓冲区,'%s='%s',缓冲区,$1);};
$1 = keyword : value
$2 = keyword : value
$3 = value
$4 = value