xtext не принимает строковую константу — ожидается RULE_ID

Я попытался сократить свою проблему до самой простой проблемы, которую я могу решить в xtext - я хотел бы использовать следующую грамматику:

M: lines += T*;

T:
    DT
    | BDT
    | N
;

BDT: 
    name = ('a' | 'b' | 'c') 
;

DT: 
     'd' name=ID 
     ('(' (ts += BDT (','ts += BDT)*) ')')? 
;

N: 
     'n' name=ID ':' type=[T]
;

Я намерен анализировать выражения формы d f(a,b,b), например, которые отлично работают. Я также хотел бы иметь возможность анализировать n g:f, который также работает, но не n g:a, где здесь часть правила BDT. Выдается ошибка "Отсутствует RULE_ID в 'a'".

Я хотел бы, например, разрешить грамматике анализировать n g:a, и я был бы очень признателен, если бы кто-нибудь мог указать, где я ошибаюсь в этой очень простой грамматике.


person user2044844    schedule 17.01.2017    source источник
comment
Чтобы ответить на мой собственный вопрос (я думаю) - проблема в том, что правило ожидает токен идентификатора, но для имени задан строковый постоянный идентификатор в правиле BDT. Я думаю, что ответ здесь заключается в том, чтобы изменить BDT на прием и идентификатор, а затем написать валидатор, чтобы ограничить его ввод.   -  person user2044844    schedule 17.01.2017


Ответы (1)


Лексирование выполняется без контекста. Ключевое слово никогда не может быть идентификатором. Вы можете решить эту проблему с помощью правил парсера.

Вы можете ввести правило типа данных

MyID: ID | "a" | ... | "c"; 

И используйте его там, где вы используете ID

person Christian Dietrich    schedule 17.01.2017