2012-03-19 1 views
0

큰 문법의 일부로 "메소드 호출"을 설명하는 규칙을 정의하려고합니다. 문제가 생겨서 터미널에 관한 지식 부족으로 문제가 줄어들 었다고 생각합니다.Xtext 규칙이 작동하지 않는 단말기로 구성

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals 
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" 

Model: methodCalls+=MethodCall*; 
MethodCall: 'call' ID '.' ID; 

그 문법 내가 지금은 메소드 이름에 와일드 카드 문자를 허용하려는

call variable.method 
call foo.bar 

같은 것을 쓸 수 있습니다 :

여기 내 문제를 설명하는 간단한 문법이다. 나는

MethodCall: 'call' ID '.' WildcardName; 

에 methodCall을-규칙을 변경하고 문법의 끝으로 나는 오류 메시지를 가지고 다시

call variable.method 
call foo.bar 

을 시도

terminal WildcardName  : ('a'..'z'|'A'..'Z'|'_'|'*'|'?') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'*'|'?')*; 

추가 :

mismatched input 'foo' expecting RULE_ID 
mismatched input 'variable' expecting RULE_ID 

'foo'와 'variable'이 아닌 이유는 무엇입니까? 터미널 ID와 일치합니까? 더 중요한 것은 왜 실제로 터미널을 사용하지 않고 새 터미널을 추가하더라도이 오류 메시지가 발생하는 이유는 무엇입니까?

답변

2

구문 분석은 렉싱 및 구문 분석의 두 단계로 수행됩니다. 터미널 규칙은 렉싱 단계에서 수행됩니다.> ID에서 와일드 카드 이름이 인식되는 곳에서 => 데이터 유형 규칙을 사용해야합니다.

WildcardName  : (ID | '*')+;