BNFC 允许使用“内部”规则来帮助进行语法定向翻译。他们给出的典型例子是类型注释
internal VarT . Exp ::= "(" Ident ":" Type ");
这为我们提供了 AST 的新部分,
Exp = ... | VarT Ident Type
这很好用!但是,如果可以允许将任意类型作为占位符放在那里以供以后使用,那将是非常好的。
internal VarT . Exp ::= "(" Ident ":" a ")";
我们将生成一个参数数据类型
Exp a = ... | VarT Ident a
然后我们可以用类型(用于类型检查器)或代码段(用于代码生成)填充它。