yacc 文件中 union 的用途是什么?它与flex文件中的yylval直接相关吗?如果不使用yylval,那么就不需要使用union?
最佳答案
union
的目的是允许将不同类型的对象存储到由flex发出的节点中。
为了更好地解释,您可以举个例子:
%union
{
int intValue;
float floatValue;
char *stringValue;
}
在 .y
中,如果您想为 int
、float
和 string
类型提供基本支持。你能用这个做什么?
有两件事:
首先,您可以在生成 token 时自动设置正确的值。想想前面例子的 .l
文件,你可以有:
[a-zA-Z][a-zA-Z0-9]* {
yylval.stringValue = strdup(yytext);
return IDENTIFIER;
}
[0-9]+ {
yylval.intValue = atoi(yytext);
return INTEGER;
}
[0-9]*\.[0-9]+"f"? {
yylval.floatValue = new atof(yytext);
return FLOAT;
}
此外,您还可以在 flex 语法中直接使用值:
nexp: nexp '+' nexp { $<floatValue>$ = $<floatValue>1 + $<floatValue>3 }
最后,如果您打算使用 OOP 语法树,您可以将 union 定义为
%union
{
class ASTNode *node;
}
其中ASTNode
是任何类型语法节点的祖先类。
关于parsing - 耶尔瓦尔和联盟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1853204/