BNFC允许人们使用“内部”规则来辅助语法指导翻译。他们给出的规范示例是类型注释
internal VarT . Exp ::= "(" Ident ":" Type ");
这为我们提供了AST的新部分,
Exp = ... | VarT Ident Type
这很棒!然而,真正好的是,如果可以允许将任意类型作为占位符放在那里以供日后使用。
internal VarT . Exp ::= "(" Ident ":" a ")";
我们将生成参数数据类型
Exp a = ... | VarT Ident a
然后我们可以用类型(用于类型检查器)或代码段(用于代码生成)来填充它。