2

同じサブルールを他のルールでも再利用したいので、分割したいルールがあります。元のバージョンは正常に動作します:

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 ノードをその子と共に他のノードの上に移動する方法はありますか?

4

1 に答える 1

2

ツリーのルートとして常に単一のトークンを使用します。次のように、別のツリーではありませbasicType2

type
  : ( basicType -> basicType )
    ( basicType2 -> ^(basicType2 basicType) )?
  ;

代わりにこれを試してください:

grammar ...

options { ... }

tokens { T2; }

...

type
  : ( basicType -> basicType )
    ( basicType2 -> ^(T2 basicType2 basicType) )?
  ;

...
于 2012-08-06T12:05:22.047 に答える