如何在野牛中优雅地处理具有多个组件的规则
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(, ); }
我以前用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(, ); }