如何在野牛中优雅地处理具有多个组件的规则

how to elegantly handle rule with multiple components in bison

我以前用ocaml编程,用ocalmyacc生成解析器。 ocaml 的一个非常有用的特征是它的变体类型,如下所示:

type exp = Number of int
| Addexp of exp*exp

有了这样的类型,我可以在解析器中非常优雅地构造一个 AST 数据结构来表示这样的 exp:

exp :
number {Number()}
| exp1 + exp2 {Addexp(,)}

那么C++和bison是否存在类似的机制呢?

是的,只需匹配 exp + exp。请注意,对于给定规则,其所有操作必须将相同的声明 %type 分配给 $$。在您的情况下,它看起来像这样:

exp: number      { $$ = PrimaryExp(); }
|    exp '+' exp { $$ = AddExp(, ); }