1

ecore モデルを解析しようとしています。インターフェイスにリンクされたフィールドがある場合、その実装値にアクセスできません。

Xtext 文法:

Map:
  type=MapCreate
  name=ID '='
  mapcontent+=MapBody (',' mapcontent+=MapBody)* ';';

  MapCreate:
  'Map' '<' keyType=MapKeyDataType ',' valueType=MapValueType '>';

MapKeyDataType:
  'String' | 'int';

MapValueType:
  MapKeyDataType | 'float' | MapCreate;

サンプル実装:

Map<int, String> ma = {0="a", 5="b"};

フィールドの解析はkeyTypeうまくいきますが、どのように同じことを行うのvalueTypeですか? 常にヌルです。

4

1 に答える 1

2

あなたの文法は偽物です。Map基本的に、 のインスタンスを のインスタンスのスーパータイプにしようとしますString。それは決して機能せず、Xtext はその文法に対していくつかの警告を表示する可能性があります。

何が起こるかは、基本的に次のとおりです。

ルールをデータ型ルールとして定義しますMapKeyDataType(詳細についてはドキュメントを参照してください)。つまり、戻り値の型はStringです。

MapValueTypeに委任するルールも定義しますMapKeyDataType。これは、戻り値の型が の戻り値の型と互換性のある代入 (スーパー型) でなければならないことを意味しMapKeyDataTypeます。Stringまたはそのスーパー タイプの 1 つである必要があります (例: ) ObjectMapValueTypeからに委任することもできますMapCreateMapCreate次に、プレーンな文字列ではなく、のインスタンスを生成しますMapCreate。あなたMapCreateとJavaのStringものは、一般的に割り当ての互換性がありません。Xtext の型推論はMapKeyDataType、もはや String を返さないようになりましたが、MapKeyDataType代わりに戻り値の型を宣言します。ただし、インスタンスはインスタンス化されないため、インスタンスはありません。パーサー ルールには割り当てがありません。そのため、あなたの文法はあなたの側で問題を引き起こします。

このようなものは、それを少しきれいにすることができます:

Map:
  type = MapType name=ID '=' ...;
MapType:
  {MapType} name='Map' '<' keyType=PlainType ',' valueType=ValueType '>';
PlainType returns Type:
  name = 'String' | name='int';
ValueType returns Type:
  MapType | PlainType | ValuePlainType;
ValuePlainType returns Type:
  name='float';
于 2014-02-26T17:48:00.117 に答える