Внутренние правила в BNFC для синтаксически направленного перевода?
BNFC позволяет использовать "внутренние" правила для помощи в синтаксически направленном переводе. Канонический пример, который они дают, для аннотации типа
internal VarT . Exp ::= "(" Ident ":" Type ");
Это дает нам новую часть AST,
Exp = ... | VarT Ident Type
Это прекрасно работает! Однако было бы неплохо, если бы можно было разрешить помещать туда произвольный тип в качестве заполнителя на будущее.
internal VarT . Exp ::= "(" Ident ":" a ")";
И мы бы сгенерировали параметрический тип данных
Exp a = ... | VarT Ident a
Затем мы могли бы заполнить это типом (для проверки типов) или сегментом кода (для генерации кода).