野牛%工会使用

时间:2015-02-28 20:14:37

标签: bison

所以,我在我的.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

或者设置$$是否覆盖了使用联合变量的能力?

1 个答案:

答案 0 :(得分:2)

您的示例显示为同一联合的不同元素分配两个值,因此第二个值将覆盖第一个值。 $$是当前操作正在生成的联合值堆栈槽,而$1$3是与那些非终端相对应的联合值槽,它们写入{{ 1}}在那些规则中&#39;动作。

使用$$只会覆盖要使用的联合中的默认字段,这通常由代码中的<type>声明确定(您不会显示)。因此,如果您的代码中有%type,则%type <value> exp$$会引用相同的内容 - $<value>$ value字段动作运行后将在bison值堆栈上推送的变量。

如果要在bison值堆栈上为同一个非终端设置多个值,请在联合中使用结构:

yyval