同じサブルールを他のルールでも再利用したいので、分割したいルールがあります。元のバージョンは正常に動作します:
type
: ( basicType -> basicType )
( '*' -> ^(TYPE_POINTER basicType)
| '[' ']' -> ^(TYPE_DYN_ARRAY basicType)
| '[' IntegerLiteral ']' -> ^(TYPE_STATIC_ARRAY IntegerLiteral basicType)
| '[' IntegerLiteral '..' IntegerLiteral ']' -> ^(REF_TYPE_SLICE IntegerLiteral IntegerLiteral basicType)
| '[' type ']' -> ^(TYPE_MAP_ARRAY type basicType)
)?
;
この規則により、通常の型 (basicType、参照または int、char などのプライマリ型) を取得して、別の AST ノードの下に配置することが可能になり、ポインター、配列などになります。これは、C のような言語では非常に一般的なことです。
ただし、次のように分割すると:
basicType2
: '*' -> ^(TYPE_POINTER)
| '[' ']' -> ^(TYPE_DYN_ARRAY)
| '[' IntegerLiteral ']' -> ^(TYPE_STATIC_ARRAY IntegerLiteral)
| '[' IntegerLiteral '..' IntegerLiteral ']' -> ^(REF_TYPE_SLICE IntegerLiteral IntegerLiteral)
| '[' type ']' -> ^(TYPE_MAP_ARRAY type)
;
type
: ( basicType -> basicType )
( basicType2 -> ^(basicType2 basicType) )?
;
すべてが見栄えがよく、解析は影響を受けませんが、AST では basicType2 の子が完全に欠落しています。TYPE_STATIC_ARRAY、または REF_TYPE_SLICE、または TYPE_MAP_ARRAY の場合、ルートのみがタイプの上にコピーされますが、サブ ノードは欠落しています。
パーサー コードをデバッグしましたが、CommonTree クラスのコピー コンストラクターが子をコピーせず、トークンとソース範囲情報のみをコピーするときに呼び出されるようです。書き換えルールを使用して、CommonTree ノードをその子と共に他のノードの上に移動する方法はありますか?