Bison Yacc/野牛父规则

Bison Yacc/野牛父规则,bison,yacc,Bison,Yacc,在Yacc/Bison中,我如何知道父规则以便采取相应的行动 例如: Module :ModuleName "=" Functions Functions :Functions Function | Function Function : DEF ID ARGS BODY { /* here, I would like to identify the parent rule and do something like this

在Yacc/Bison中,我如何知道父规则以便采取相应的行动

例如:

Module
    :ModuleName "=" Functions

Functions
    :Functions Function
    | Function

Function
    : DEF ID ARGS BODY
      {
           /* here, I would like to identify the parent rule and do something like this*/
          if ($parent_rule == "Module") {
              /* take some actions */
          } else {
              /* this means the Function is matched recursively from the Functions rule. */
          }
      }
LR(1)解析器是自底向上的。当给定产量减少时,“父规则”尚不清楚

在任何情况下,您的产品<代码>功能<代码>仅在<代码>功能<代码>的上下文中减少,尽管有两种可能的产品可能适用

当然,确定哪种产品适用于产品本身没有问题。所以人们通常会这样做:

%type <FunctionList> Functions
%type <FunctionDef>  Function
...

%%

...

Functions
    : Functions Function
      { $$ = $1;
        $$.append($2);
      }
    | Function
      { $$ = newFunctionList();
        $$.append($1);
      }

Function
    : DEF ID ARGS BODY
      {
          $$ = newFunctionDef($2, $3, $4);
      }
%类型函数
%类型函数
...
%%
...
功能
:功能
{ $$ = $1;
$$追加(2美元);
}
|作用
{$$=newFunctionList();
$$追加(1美元);
}
作用
:DEF ID ARGS BODY
{
$$=newFunctionDef($2,$3,$4);
}
LR(1)解析器是自下而上的。当给定产量减少时,“父规则”尚不清楚

在任何情况下,您的产品<代码>功能<代码>仅在<代码>功能<代码>的上下文中减少,尽管有两种可能的产品可能适用

当然,确定哪种产品适用于产品本身没有问题。所以人们通常会这样做:

%type <FunctionList> Functions
%type <FunctionDef>  Function
...

%%

...

Functions
    : Functions Function
      { $$ = $1;
        $$.append($2);
      }
    | Function
      { $$ = newFunctionList();
        $$.append($1);
      }

Function
    : DEF ID ARGS BODY
      {
          $$ = newFunctionDef($2, $3, $4);
      }
%类型函数
%类型函数
...
%%
...
功能
:功能
{ $$ = $1;
$$追加(2美元);
}
|作用
{$$=newFunctionList();
$$追加(1美元);
}
作用
:DEF ID ARGS BODY
{
$$=newFunctionDef($2,$3,$4);
}