XText: использовать определения пользовательских терминалов - PullRequest
3 голосов
/ 14 апреля 2011

Я совершенно новичок в XText.

Когда вы определяете грамматику с помощью XText, вы можете указать вторую грамматику и использовать определения, которые она объявляет так, как сказано здесь :

grammar org.eclipse.xtext.example.Domainmodel with org.eclipse.xtext.common.Terminals

В Xtext каждая грамматика имеет уникальное имя, которое, подобно общедоступным классам Java, должно отражать расположение файла в пути к классам Java.В нашем случае файл грамматики находится в /org/eclipse/xtext/example/Domainmodel.xtext, поэтому имя грамматики org.eclipse.xtext.example.Domainmodel.Вторая часть этого оператора (с org.eclipse.xtext.common.Terminals) утверждает, что эта грамматика повторно использует и переопределяет правила из указанной грамматики.Org.eclipse.xtext.common.Terminals - это грамматика библиотеки, поставляемая с Xtext и предопределяющая наиболее распространенные терминальные правила

Я разрабатываю плагин XText и хочу определить свои собственные терминальные символыв отдельном файле.Является ли это возможным?Как я могу это сделать?

Я попытался создать новый файл Xtext и добавить его после org.eclipse.xtext.common.Terminals и добавить только шахту, но оба решения не компилируются.

Спасибо.

РЕДАКТИРОВАТЬ

Если я использую два файла xtext в одном проекте, один для грамматики и один для терминалов грамматики, я получаю следующееисключение при запуске файла mwe2:

java.lang.IllegalStateException: проблема при анализе 'classpath: /org/xvr/language/sh/ShaderDsl.xtext': [XtextLinkingDiagnostic: null: 1 Не удалось разрешитьссылка на грамматику 'org.xvr.language.sh.ShTerminal'., XtextLinkingDiagnostic: null: 9 Не удалось разрешить ссылку на AbstractRule 'ID'., TransformationDiagnostic: null: 14 Невозможно создать тип данных INVARIANT (ErrorCode: NoSuchTypeostDavisionable)null: 17 Невозможно создать тип данных PRECISION (ErrorCode: NoSuchTypeAvailable), TransformationDiagnostic: null: 19 Невозможно создать тип данных HIGH_PRECISION (ErrorCode: NoSuchTypeAvailable), TransformationDiagnostic: null: 20 Невозможно создать тип данных MEDIUM_PRECISION (ErrorCode: NoSuchTypeAvailable), TransformationDiagnostic: null: 21 Невозможно создать тип данных LOW_PRECISION (ErrorCode: NoSuchType 10 * 282 * 1027) 255*

грамматика

grammar org.xvr.language.sh.ShaderDsl with org.xvr.language.sh.ShTerminal //org.eclipse.xtext.common.Terminals

generate shaderDsl "http://www.xvr.org/language/sh/ShaderDsl"
....

и терминалы грамматики

grammar org.xvr.language.sh.ShTerminals with org.eclipse.xtext.common.Terminals
generate shTerminals "http://www.xvr.org/language/sh/ShTerminals"

terminal Test : 'test';

1 Ответ

5 голосов
/ 14 апреля 2011

У вас есть много вариантов (все они описаны в онлайн-справке):

  1. Определите правила вашего терминала прямо в грамматике, с которой вы сейчас работаете.
  2. Создайте новую специальную грамматику для терминальных символов, аналогично тому, что мы делали с common.Terminals. Используйте его вместо обычных терминалов.
  3. Создайте новую специальную грамматику для терминальных символов, повторно используйте общие. Терминалы в этой грамматике и используйте свою собственную терминальную грамматику на вашем реальном языке.

Я бы рекомендовал просто переопределить терминалы, которые вы хотите изменить, прямо на вашем языке (вариант 1) или если вы хотите определить несколько языков с одним и тем же набором терминалов, которые я бы использовал (вариант 3), или объединить оба варианты, например

grammar org.mycompany.MyTerminals with org.eclipse.xtext.common.Terminals

terminal ID: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
terminal SL_COMMENT: '--' !('\n'|'\r')* ('\r'? '\n')?;

==

grammar org.mycompany.MyLanguage with org.mycompany.MyTerminals

MyModel: name=ID other=ANOTHER;

terminal ANOTHER: '/#' -> '#/'
...