2014-11-17 3 views
1

У меня есть собственное определение XText грамматики:XText - как использовать «импорт» в собственной грамматике

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

generate myOtherDsl "http://www.xtext.org/example/mydsl/MyOtherDsl" 

OtherModel: 
    Foo | Bar; 

Foo: 'foo' name=ID; 

Bar: 'bar' name=ID; 

Теперь я хочу использовать эту грамматику в (стандартном примере) XText грамматика с помощью «импорта» :

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

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" 

import "http://www.xtext.org/example/mydsl/MyOtherDsl" as other 

Model: 
    greetings+=Greeting* 
    foobars+=FooBar*; 

Greeting: 'Hello' name=ID '!' foo=[other::Foo]; 

FooBar: other::Foo | other::Bar; 

Хотя Greeting: 'Hello' name=ID '!' foo=[other::Foo]; работает, FooBar: other::Foo | other::Bar; бросает ошибку: нет жизнеспособной альтернативы на входе 'другой'. В правиле Greeting я использую ссылку для атрибута (foo). В правиле FooBar я просто хочу использовать его как тип. Как мне это сделать?

Любая помощь приветствуется.

Спасибо, Andreas

+0

Привет, что ваше намеренное поведение? вы хотите вызвать правило из другой грамматики? это работает только с наследованием –

+0

Привет, христианин, у меня очень большая грамматика DSL и вы хотите разбить ее на разные части (т. е. разделенные файлы .xtext в одном проекте). Например, грамматика разделяется на A.xtext, B.xtext и C.xtext и один общий G.xtext (для собственных терминалов и т. Д.). A, B и C используют грамматическое смешивание (ключевое слово «с») для наследования грамматики G. Но мне также нужно снова объединить A, B и C в одну грамматику, поэтому я хочу использовать здесь «import». – user3510462

ответ

2

XText только поддерживает один Inhertiance Иерархия

grammar org.xtext.example.mydsl.MyDslBase with org.eclipse.xtext.common.Terminals 
grammar org.xtext.example.mydsl.MyDslGrandParent with org.xtext.example.mydsl.MyDslBase 
grammar org.xtext.example.mydsl.MyDslParent with org.xtext.example.mydsl.MyDslGrandParent 
grammar org.xtext.example.mydsl.MyDslChild with org.xtext.example.mydsl.MyDslParent 

так что это не возможно развела на несколько и сгруппировать их togther в одном DSL

+0

Почему я не могу использовать ключевое слово 'import' для использования дополнительных грамматик (кроме того, что я смешиваю в своей грамматике с ключевым словом' with')? В приведенном выше примере я могу использовать 'import' без каких-либо проблем для правила' Greeting', но не для правила 'FooBar'. Есть ли предполагаемое поведение Xtext для использования импортированных правил в (cross-) ссылках, а не в правилах, состоящих из альтернатив? Изменить: из приведенного выше ответа я предполагаю, что это невозможно. Таким образом, в принципе не рекомендуется разделять грамматику на отдельные файлы (когда я не могу построить строгую иерархию)? – user3510462

+1

импорт предназначен для импорта метамодели !!! (EClasses и т. Д.), А не о грамматике (правила и т. Д.), Если вы делаете крест ref other :: Foo вы просто используете метамодель, а НЕ грамматику –

+1

Хорошо, спасибо за это. Я приму свой ответ, потому что, видимо, нет (хорошего) способа разделить грамматику на отдельные файлы. Использование ключевого слова 'with' не полезно, если у вас также есть кросс-зависимости между разделенными грамматиками (например, грамматика' A' распространяется от общей грамматики 'G', но также требует некоторых правил из грамматики' B'). Если есть другой способ, пожалуйста, дайте мне знать. – user3510462

Смежные вопросы