2017-11-13 10 views
0

내가 좋아 아래에 보이는 문법을 가지고있다. 그래서 나중에 모듈을 호출하려고하면 정의 된 모듈 이름 (따옴표 유무와 상관없이)을 물어보고 모듈 이름이 아닌 새로운 변수 이름을 입력 할 수도 있습니다.Xtext에서 여러 항목에 대한 상호 참조는 어떻게합니까?</p> <pre><code>Module: MOD mid=ModId ; Stmt: CALL nam=ModName ';'; ModName: (idn1=[ModId|ID] | ('"' idn2=[ModId|ID] '"') | (idn3=ID idn4=ID)); </code></pre> <p>는 기본적으로,이 모듈 이름이 언급 된 문이 :

어떻게해야합니까? 모듈 이름을 참조하거나 이름을 정의 할 수 있습니다. 둘 다 사용할 수는 없습니다.

예제 프로그램 :

Module add 

Module subtract 

Module divide 

call add; //referencing module name 

call "subtract"; // referencing module name in quotes 

call operation; // without reference 

감사합니다,

Anitha는

답변

0

그 여러 문제가 있습니다. 문자열을 참조하기위한 첫

는 ID 전용 또는 단지 참조 중 하나를 가지고 당신이 문법을 변경해야 할 선택 기준을 가지고 들어 https://christiandietrich.wordpress.com/2015/03/19/xtext-and-strings-as-cross-references/

를 보라. IDOnly의 경우는

ModNameManipulator returns ModName: ref=[XXXX] 

그런 짓을 그리고 참조를 생성/채울 IDerivedStateComputer 및 SyntheticLinkingSupport를 사용할 수 있습니다.

또는 throw 오류가 없도록 링크를 적용합니다. 두 가지 솔루션 모두 사소한 것이 아니기 때문에보다 정확한 Xtext 지식이 필요합니다.

+0

간단하게하기 위해 문제 정의를 조금 바꿀 수 있습니다. 이제 call 문에서 모듈 이름이나 변수 이름을 호출 할 수 있습니다. 서로 다른 두 가지 유형의 참조 방법은 무엇입니까? 이를 달성하기 위해 범위 지정을 시도했지만 여전히 첫 번째 형식 (모듈 이름) 만 표시합니다. – Anitha

+0

슈퍼 타입 MySupertype을 inteoduce해야합니다 : A | B와 그 하나를 참조하십시오 –

+0

감사합니다. – Anitha

0

감사합니다. ModId에 이름을 지정하지 않으면 어리석은 실수를 저지르고있었습니다. 이제 콘텐츠 지원이 제대로 작동합니다.

문법은 이제 다음과 같습니다

Module: 'MOD' mid=ModuleName; 
ModuleName: name = identifier; 

Var: d=DataType v=VarName; 
VarName: name=identifier; 

Stmt: 'Call' ((idn1=[Names|ID] 'Mod.')| (idn3=[Names|ID] idn4=ID '.')); 

Names: id = ModuleName| id2 = VarName; 

내가 컨텐츠 지원을 위해 MODULENAME 및 VarName과 모두를 제공 할 수 있도록 목록을 병합 할 범위 지정의 변경했습니다. 이것은 잘 작동합니다. 내가 잘못 여기서 뭐하는 거지

을 "이름에 대한 참조를 확인할 수 없습니다"- 나는 값을 입력하면

그러나, 그것은 오류가 말을 던졌습니다?

+0

완전 재현 가능한 문법 및 샘플 모델을 제공 할 수 있습니다 –

+0

죄송합니다. 나는이 일찍 돌아갈 수 없었다. 하지만 문제를 해결할 수 있었고 이전에 제대로 구축되지 않았다고 생각합니다. 현재 작동 중입니다. 도와 주셔서 감사합니다. – Anitha