2014-02-26 5 views
0

ecore 모델을 구문 분석하려고합니다. 인터페이스가 연결된 필드가 있다면 구현 값에 액세스 할 수 없습니다.Xtext EMF 모델 인터페이스를 구문 분석합니다.

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와 동일한 기능을 수행 할? 항상 null입니다.

답변

2

당신의 문법은 가짜입니다. 기본적으로 Map의 인스턴스를 String의 수퍼 유형으로 설정하십시오. 그것은 결코 작동하지 않을 것이고 Xtext는 그 문법에 대한 경고를 나타낼 것입니다.

당신은 데이터 유형 규칙과 규칙 MapKeyDataType (자세한 내용은 문서 참조)를 정의 : 어떻게됩니까

는 다음과 같은 기본적이다. 즉, 반환 유형은 String입니다.

또한 MapKeyDataType에 위임하는 규칙 MapValueType을 정의합니다. 이는 반환 유형이 MapKeyDataType의 반환 유형의 할당 호환 (수퍼 유형)이어야 함을 의미합니다. String이거나 수퍼 유형 중 하나 여야합니다 (예 : 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'; 
이 같은

뭔가 조금 그것을 청소 수