У меня есть 2 разных DSL. Они связаны в своей грамматике таким образом, что на «хобби», определенные в 1 DSL, можно ссылаться во 2-м DSL. Я хочу иметь правило проверки, что все хобби упоминаются во 2-м DSL.
Как я могу получить все определенные хобби первого DSL в файле проверки 2-го DSL?
Первый DSL с именем "MyDsl.xtext" выглядит следующим образом:
'I' 'am' name=ID
greetings+=HelloGreeting* 'Hobbies' hobbies+=Hobbie+
('I_dont_like' detests+=[Hobbie|QualifiedName])?
;
Hobbie:
'eg' name=ID
;
HelloGreeting:
'Hello' person=[Person] '!'
;
Второй DSL под названием «MyDsl1.xtext» выглядит следующим образом:
JustGreetings:
greetings+=HiGreeting* stuff=Stuff
;
HiGreeting:
'Hi' person=[imported::Person] '!'
;
Stuff:
'I_also_like_to_do:' hobbies+=[imported::Hobbie|QualifiedName]+
;
Проверка, которую я пытаюсь выполнить в файле проверки, выглядит следующим образом:
import org.eclipse.xtext.validation.Check;
import org.xtext.example.mydsl.myDsl.Person
import org.xtext.example.mydsl1.myDsl1.Stuff
class MyDsl1Validator extends AbstractMyDsl1Validator {
public static val INVALID_NAME = 'invalidName'
boolean found
@Check
def checkWalking(Stuff stuffs) {
var myHobbies = stuffs.hobbies
var definedHobbies = getPersons().hobbies
for (i: 0..definedHobbies.size) {
found = false
for (j: 0..myHobbies.size) {
if (definedHobbies.get(i).name == myHobbies.get(j).name) {
found = true
}
}
if (found == false) {
error("you are missing hobbie" + myHobbies.get(i).name + '.', null)
}
}
}
}
Текущий результат: Прямо сейчас я могу импортировать тип Person в импорте, который не дает ошибок, но я не знаю, как получить все экземпляры.
Ожидаемый результат: я могу получить список лиц, определенных в другомDSL и используйте его для сравнения.
Редактировать:
Пример ввода:
definition.mydsl
I am A
Hello B !
Hobbies eg walking
использование.mydsl1
Hi A!
I_also_like_to_do: A.walking