我探索了Bison的语法,并且有一些关于某些结构的问题,比如
bodystmt:
{
$<num>$ = parser->line;
}
我知道$$和$ 1,而num是一个类型..但这对我来说是新的
答案 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