bison - 我可以通过引用传递非平凡的 YYSTYPE 吗?
bison - can I pass non-trivial YYSTYPE by reference?
例如,我在 .ypp 中有这个声明:
%{
#include <iostream>
#include <stdlib.h>
#include "structs.h"
#include "func.h"
#define YYSTYPE Types
%}
%union Types{
int Integer;
bool Boolean;
Expression Exp;
};
在 "structs.h" 我有:
typedef union{
string str;
int integer;
bool boolean;
} Value;
struct Expression {
int lineNum;
Value val;
};
在 "func.h" 我有这个功能:
int binop(Types& a, Types& b); //assume all file needed included
我可以在 .ypp 中传递 $$ arg:
Exp : Exp Add Exp {$$.integer = binop(, );}
您当然可以通过引用传递语义值,但您不能假定该引用在执行语义操作后仍然有效。所以不要保持对语义值的持久引用。
语义值存储在解析器栈中,解析器栈槽在解析器方便时被重用(因为它确实是一个栈)。特别是,...$n
槽在执行语义操作后立即弹出,而 $$
是一个临时值,在 ...$n
弹出后被压入(复制)到堆栈中。
即使值没有立即弹出——就像中间规则语义操作的情况一样——解析器堆栈也可能被重新分配(从而使所有引用无效)以适应推送。
例如,我在 .ypp 中有这个声明:
%{
#include <iostream>
#include <stdlib.h>
#include "structs.h"
#include "func.h"
#define YYSTYPE Types
%}
%union Types{
int Integer;
bool Boolean;
Expression Exp;
};
在 "structs.h" 我有:
typedef union{
string str;
int integer;
bool boolean;
} Value;
struct Expression {
int lineNum;
Value val;
};
在 "func.h" 我有这个功能:
int binop(Types& a, Types& b); //assume all file needed included
我可以在 .ypp 中传递 $$ arg:
Exp : Exp Add Exp {$$.integer = binop(, );}
您当然可以通过引用传递语义值,但您不能假定该引用在执行语义操作后仍然有效。所以不要保持对语义值的持久引用。
语义值存储在解析器栈中,解析器栈槽在解析器方便时被重用(因为它确实是一个栈)。特别是,...$n
槽在执行语义操作后立即弹出,而 $$
是一个临时值,在 ...$n
弹出后被压入(复制)到堆栈中。
即使值没有立即弹出——就像中间规则语义操作的情况一样——解析器堆栈也可能被重新分配(从而使所有引用无效)以适应推送。