所以,我在我的.y语法中设置了一个AST,下面是如何使用它的示例片段:
typedef struct node
{
struct node *left;
struct node *right;
char *token;
} node;
...
exp : term {$$ = $1;}
| exp PLUS term {$$ = mknode($1, $3, "+");}
| exp MINUS term {$$ = mknode($1, $3, "-");}
;
...
node *mknode(node *left, node *right, char *token)
{
/* malloc the node */
node *newnode = (node *)malloc(sizeof(node));
char *newstr = (char *)malloc(strlen(token)+1);
strcpy(newstr, token);
newnode->left = left;
newnode->right = right;
newnode->token = newstr;
return(newnode);
}
我的问题是,像这样设置,是否仍然可以将%union用于其他值? 即。
%union{
int value;
}
exp : term {
$$ = $1;
$<value>$ = $<value>1;
}
| exp PLUS term {
if($<value>1 == $<value>3) {
$$ = mknode($1, $3, "+");
$<value>$ = $<value>1;
}
}
...etc
或者设置$$是否覆盖了使用联合变量的能力?
答案 0 :(得分:2)
您的示例显示为同一联合的不同元素分配两个值,因此第二个值将覆盖第一个值。 $$
是当前操作正在生成的联合值堆栈槽,而$1
和$3
是与那些非终端相对应的联合值槽,它们写入{{ 1}}在那些规则中&#39;动作。
使用$$
只会覆盖要使用的联合中的默认字段,这通常由代码中的<type>
声明确定(您不会显示)。因此,如果您的代码中有%type
,则%type <value> exp
和$$
会引用相同的内容 - $<value>$
value
字段动作运行后将在bison值堆栈上推送的变量。
如果要在bison值堆栈上为同一个非终端设置多个值,请在联合中使用结构:
yyval