BNFC では、「内部」ルールを使用して、構文による変換を支援できます。彼らが与える標準的な例は、型注釈用です
internal VarT . Exp ::= "(" Ident ":" Type ");
これにより、AST の新しい部分が得られます。
Exp = ... | VarT Ident Type
これはうまくいきます!ただし、後で使用するプレースホルダーとして任意の型をそこに置くことができれば、本当に素晴らしいことです。
internal VarT . Exp ::= "(" Ident ":" a ")";
そして、パラメトリックデータ型を生成します
Exp a = ... | VarT Ident a
次に、これを型 (型チェッカーの場合) またはコード セグメント (コード生成の場合) で埋めることができます。