Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 耶尔瓦尔与联合_Parsing_Yacc_Bison_Lexical Analysis - Fatal编程技术网

Parsing 耶尔瓦尔与联合

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

yacc文件中union的目的是什么?它是否与flex文件中的yylval直接相关?如果不使用yylval,则不需要使用union?

union声明修改了
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*
(如果内存可用)。