我看到很多例子,有些人把yytext传递给yylval,而其他人没有。
这是lex和yacc中一个简单加法器的代码

/* add.l */
digit [0-9]
%%
{digit}+ {sscanf(yytext, "%d", &yylval);
return(INT);
}
\+ return(PLUS);
\n return(NL);
. ;
%%
int yywrap() { return 1; }


/* add.y */
/* L = {INT PLUS INT NL} */
%token INT PLUS NL
%%
add: INT PLUS INT NL { printf("%d\n", $1 + $3);}
%%
#include "lex.yy.c"
yyerror(char *s) { printf("%s\n", s); }
main() {
 return yyparse();
}

我看不到printf(yylval)等代码。为什么这里存在代码sscanf(yytext, "%d", &yylval)。这里是不是用了yylval,如果我们不加上那一行呢?我们什么时候需要在lex中包含这样的行?

最佳答案

摘自here(推荐阅读):
在普通(非进入)解析器中,标记的语义值
必须存储在全局变量yylval中。当你使用
对于语义值,只有一种数据类型,yylval有这种类型。
这意味着,与标记关联的值存储在该特定变量中。

关于c - yylval在lex和yacc中的作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58416632/

10-10 18:22
查看更多