Как часть большой грамматики, я пытаюсь определить правила для описания "вызовов методов". У меня возникли проблемы, и я думаю, что свел проблему к недостатку знаний о терминалах.
Вот простая грамматика, описывающая мою проблему:
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 на
MethodCall: 'call' ID '.' WildcardName;
и к концу грамматики я добавил
terminal WildcardName : ('a'..'z'|'A'..'Z'|'_'|'*'|'?') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'*'|'?')*;
Попытка
call variable.method
call foo.bar
снова я получил сообщения об ошибке:
mismatched input 'foo' expecting RULE_ID
mismatched input 'variable' expecting RULE_ID
Почему 'foo' и 'variable' не совпадают по идентификатору терминала? И что более важно, почему даже добавление нового Терминала без его фактического использования вызывает это сообщение об ошибке?