Правило Xtext, состоящее из не работающих терминалов - PullRequest
0 голосов
/ 19 марта 2012

Как часть большой грамматики, я пытаюсь определить правила для описания "вызовов методов". У меня возникли проблемы, и я думаю, что свел проблему к недостатку знаний о терминалах.

Вот простая грамматика, описывающая мою проблему:

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' не совпадают по идентификатору терминала? И что более важно, почему даже добавление нового Терминала без его фактического использования вызывает это сообщение об ошибке?

1 Ответ

3 голосов
/ 19 марта 2012

синтаксический анализ выполняется в два этапа: лексизация и синтаксический анализ.Терминальные правила выполняются в фазе лексинга => в тех местах, где вы ожидаете идентифицировать идентификатор WildcardName => для этого вы также должны использовать правило типа данных

WildcardName       : (ID | '*')+;
...