Xtext: ссылка на класс Java из MyDsl

В моем DSL я хочу иметь код, который выглядит следующим образом:

SomeType varName;

куда SomeType это класс Java

Позже, если допустим, SomeType является jum-классом enum, и кто-то пишет

varName=SOME_VALUE

Я хочу сделать проверку, чтобы увидеть, есть ли на самом деле SomeType.java SOME_VALUE как значение в его перечислении. Я видел этот учебник https://eclipse.org/Xtext/documentation/305_xbase.html

но я не уверен, что это то, что мне нужно (мне нужно импортировать файлы.mydsl, а не только jvm). Любая помощь будет оценена. Благодарю.

1 ответ

Решение

Если вы хотите ссылки на типы Java, используйте org.eclipse.xtext.xbase.Xtype как супер грамматика. Тогда вы можете написать правило, как

VariableDeclaration:
    type=JvmTypeReference name=ValidID ';';

выразить ваш пример кода.

Если вы также хотите выразить назначения, я предлагаю использовать org.eclipse.xtext.xbase.Xbase в качестве супер грамматики (которая наследуется от Xtype) и использовать правило XExpression везде, где вы хотите ссылаться на элементы из Java, например

VariableAssignment:
    variable=[VariableDeclaration|ValidId] '=' expression=XExpression;

Чтобы упростить задачу, вы также можете использовать XExpression для объявлений переменных (XVariableDeclaration - это специальное XExpression) и для присваиваний (XAssignment - еще одно специальное XExpression). Это позволило бы писать такие вещи, как

{
    var SomeType varName
    varName = SomeType.SOME_VALUE
}

с помощью одного вызова XBlockExpression (составное выражение, окруженное фигурными скобками):

MyFunkyRule:
    ...
    expressionBlock=XBlockExpression
    ...
Другие вопросы по тегам