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 弹出后被压入(复制)到堆栈中。

即使值没有立即弹出——就像中间规则语义操作的情况一样——解析器堆栈也可能被重新分配(从而使所有引用无效)以适应推送。