あなたの文法は偽物です。Map
基本的に、 のインスタンスを のインスタンスのスーパータイプにしようとしますString
。それは決して機能せず、Xtext はその文法に対していくつかの警告を表示する可能性があります。
何が起こるかは、基本的に次のとおりです。
ルールをデータ型ルールとして定義しますMapKeyDataType
(詳細についてはドキュメントを参照してください)。つまり、戻り値の型はString
です。
MapValueType
に委任するルールも定義しますMapKeyDataType
。これは、戻り値の型が の戻り値の型と互換性のある代入 (スーパー型) でなければならないことを意味しMapKeyDataType
ます。String
またはそのスーパー タイプの 1 つである必要があります (例: ) Object
。MapValueType
からに委任することもできますMapCreate
。MapCreate
次に、プレーンな文字列ではなく、のインスタンスを生成します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';