Не могу понять ANY_OTHER

Я пытаюсь изучить xtext и нахожу ANY_OTHER совершенно запутанным, и у меня есть несколько вопросов по этому поводу.

У меня есть только одна продукция в моем файле .xtext.

document: text = '<' ANY_OTHER* '>';

когда я запускаю это как «приложение eclipse», следующие входные данные работают правильно:

<>
< >
<.>
<....>
<.. ..>

но следующее появляется сбой:

<a>

с ошибкой посторонний ввод 'a', ожидающий '>'.

Q1) Почему ANY_OTHER соответствует буквальному символу '.' персонаж?

Я попытался переопределить ANY_OTHER как

terminal ANY_OTHER: .;

Я полагаю, что это исходное определение в Common Terminals здесь.

Теперь поведение меняется. Ошибка при вводе исчезла. но если я попытаюсь

<aa>

, выдает ошибку посторонний ввод 'aa', ожидающий '>'.

Вопрос 2. Почему переопределение ANY_OTHER меняет поведение?

Q3) Почему '.' обрабатывается иначе, чем «а»? ‹..> принимается, но не является.


person Atul Acharya    schedule 24.03.2013    source источник


Ответы (1)


Я отвечу на ваши три вопроса одним ответом, потому что здесь это имеет смысл.

По умолчанию первая строка грамматики выглядит так

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

если вы не измените его вручную. Я думаю, что ваш все еще выглядит так. Это означает, что ваша собственная грамматика будет использовать org.eclipse.xtext.common.Terminals по умолчанию, так что вы правы. ANY_OTHER указывается в «общей» грамматике.

В соответствии с указанными правилами: Одиночный файл . соответствует одному символу. В дополнение к этому правилу вы найдете правило ID в «общей» грамматике, которое соответствует всем текстовым символам и некоторым другим. Здесь важно, что само правило ID содержит количество, а правило ANY_OTHER соответствует только одному символу. Таким образом, по умолчанию правила будут соответствовать этим примерам.

A   --> 1 instance of ID
*.* --> 3 instances of ANY_OTHER
AAA --> 1 instance of ID
A.A --> 2 instances of ID, 1 instance of ANY_OTHER

При переопределении правила ANY_OTHER порядок синтаксического анализа меняется. Вы можете найти некоторую информацию об этом в документации. Это приводит к другому поведению:

A   --> 1 instance of ANY_OTHER
*.* --> 3 instances of ANY_OTHER
AAA --> 1 instance of ID
A.A --> 3 instances of ANY_OTHER

Я надеюсь, что эта информация поможет.

person abs    schedule 24.03.2013
comment
Спасибо. некоторые вещи яснее. Дайте мне посмотреть, правильно ли я понимаю. Для Q1 'a' в <a> соответствует идентификатору, и поскольку я ожидаю ЛЮБОЕ_ДРУГОЕ, возникает ошибка. это правильно? Вторая часть еще не ясна, переопределяя, я изменяю приоритет? Думаю, нужно снова прочитать документы! Спасибо еще раз. - person Atul Acharya; 24.03.2013