gpt4 book ai didi

parsing - yacc/lex 的基本问题

转载 作者:行者123 更新时间:2023-12-04 06:49:23 25 4
gpt4 key购买 nike

我对一个非常简单的 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):
TranslationUnit:
/* Nothing */
| InfoBlock Data
;

InfoBlock:
/* Nothing */
| InfoBlock InfoExpression {}
;

InfoExpression:
WORD PV WORD ENDLINE { printf("$1 = %s\n",$1);
printf("$2 = %s\n",$2);
printf("$3 = %s\n",$3);
printf("$4 = %s\n",$4);
}
| ... /* other things */
;

Data:
... /* other things */

当我用输入运行我的程序时:
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

我不明白这个结果。我前段时间学习过语法,即使我现在不记得所有事情,我也看不到任何重要的错误......

在此先感谢您的帮助。

最佳答案

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

另见 SO 2696470遇到并诊断出相同的基本问题。

关于parsing - yacc/lex 的基本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3344267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com