Parsing 耶尔瓦尔与联合
yacc文件中union的目的是什么?它是否与flex文件中的yylval直接相关?如果不使用yylval,则不需要使用union?union声明修改了Parsing 耶尔瓦尔与联合,parsing,yacc,bison,lexical-analysis,Parsing,Yacc,Bison,Lexical Analysis,yacc文件中union的目的是什么?它是否与flex文件中的yylval直接相关?如果不使用yylval,则不需要使用union?union声明修改了yylval的类型 bison手册: 在普通(非进入)解析器中,令牌的语义值必须存储在全局变量yylval中。当您仅为语义值使用一种数据类型时,yylval具有该类型。因此,如果类型为int(默认值),则可以在yylex中编写此代码: ... yylval = value; /* Put value onto Bison stack. */ r
yylval
的类型
bison
手册:
在普通(非进入)解析器中,令牌的语义值必须存储在全局变量yylval
中。当您仅为语义值使用一种数据类型时,yylval
具有该类型。因此,如果类型为int
(默认值),则可以在yylex
中编写此代码:
...
yylval = value; /* Put value onto Bison stack. */
return INT; /* Return the type of the token. */
...
使用多个数据类型时,yylval
的类型是由%union
声明组成的联合(请参阅值类型集合一节)。因此,在存储令牌的值时,必须使用正确的联合成员。如果%union
声明如下所示:
%union {
int intval;
double val;
symrec *tptr;
}
...
yylval.intval = value; /* Put value onto Bison stack. */
return INT; /* Return the type of the token. */
...
那么yylex
中的代码可能如下所示:
%union {
int intval;
double val;
symrec *tptr;
}
...
yylval.intval = value; /* Put value onto Bison stack. */
return INT; /* Return the type of the token. */
...
union
的目的是允许将不同类型的对象存储到flex发出的节点中
为了更好地解释,您可以使用以下示例:
%union
{
int intValue;
float floatValue;
char *stringValue;
}
在.y
中,如果要为int
、float
和string
类型提供基本支持。你能用这个做什么
两件事:
首先,您可以在生成令牌时自动设置正确的值。考虑上一个示例的.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语法中直接使用value:
其中,
ASTNode
是任何语法节点的祖先类。为什么要定义一个元素的并集?为什么不干脆#定义YYSTYPE类ASTNode*
(如果内存可用)。