2011-12-05 4 views
2

내 DSL 변수가 동적인데, 이는 처음 값이 할당 될 때 생성됩니다. 그래서이 유효한 코드는 다음과 같습니다Xtext 문법을 사용하여 동적 변수를 처리하십시오.

a = 0 
b = 2 // new variable created 
a = 3 // existing variable reassigned 

내 순진 접근 방식은 "2를 다음과 같은 대안이 일치 될 수 없다"불평, 그것은 작동하지 않습니다이

Identifier: 
    ID; // ID from Terminals 

Assignable: 
    {Assignable} ref=[Identifier|ID] | 
    {Assignable} newVar=Identifier; 

같은 규칙을 가지고하는 것입니다. 생성 된 ANTLR 디버그 문법 규칙을 포함하고 있기 때문에 그것은 이해할 수 :

ruleAssignable: ruleIdentifier | ruleIdentifier; 

([Identifier|ID]의 비결은 question on cross-referencing에 대한 응답에서 온다 난 그냥 또한이 해결 어떻게 grok 수하려고 :) 완전히 이해없이 복사됩니다.

{XAssignment} /* (declaringType=[types::JvmDeclaredType] '::')? */ feature=[types::JvmIdentifiableElement|ValidID] OpSingleAssign value=XAssignment 

상호 참조 만 사용하는 것처럼 보이고 새로운 변수 선언을 처리하는 방법을 볼 수 없습니다.

답변

1

변수 선언과 할당 식에 동일한 구문을 사용하는 것은 좋지 않습니다. 가능하면 선언문에 키워드 또는 특수 연산자를 도입했습니다.

할 수 없거나 원하지 않는 경우에는 상호 참조 또는 간단한 식별자를 결정하는 것이 힘든 방법입니다.

처음 사용하는 경우 해결되지 않은 참조에 대한 오류 메시지를 사용 중지해야합니다. 후자를 선택하면 컨텐츠 어시스트와 하이퍼 링크를 수동으로 포착해야합니다.

+0

그것은 coffeescript의 기존 문법이므로 변경할 수 없습니다. 나는 당신의 답을 통해 상호 참조를 사용하는 것이 더 쉽고, 할당 문맥에서 오류 메시지를 사용하지 못하게한다는 인상을받습니다. –

+0

그래, 그 일은 덜한 것 같다. –