Bison的$ <num> $ do&gt;?</num>是什么?

时间:2014-02-23 16:35:48

标签: bison

我探索了Bison的语法,并且有一些关于某些结构的问题,比如

       bodystmt:
       {
           $<num>$ = parser->line;
       }

我知道$$和$ 1,而num是一个类型..但这对我来说是新的

1 个答案:

答案 0 :(得分:2)

这是一个显式类型标记,它会覆盖该值的声明类型。所以如果你有:

%union {
    int  num;
    char *str;
}

%type<str> bodystmt

%%

bodystmt: { $<num>$ = ... }

它设置了联合中的num字段,而不是标题中str扩展所声明的%type字段。当然,该值的其他用法(例如,在rhs上使用$1的其他规则中为bodystmt)将访问str字段,因此需要将它们更改为改为$<num>1以避免未定义的行为。

如果您有嵌入不同类型的操作,那么这很有用:

%type<num> foo baz
%%
rule: { $<num>$ = 5; } foo { $<str>$ = "bar" } baz {
                     x = $<num>1;  /* gets the 5 stored in the first action */
                     y = $2;       /* the result of rule 'foo' */
                     z = $<str>3;  /* the string '"bar"' */
                     printf("%d %d\n", $2, $4); }

foo: A B { $$ = $<num>0; /* gets the value stored by the action just before the 'foo' in the rule that triggers this rule }

baz: { $<num>$ = strlen($<str>0); } foo  /* the <num> here is redundant and has no effect */

所以上面的代码(除了做一堆无用的东西用于说明)如果得到输入ABAB,将打印5 3