2014-09-09 4 views
0

Вот снимок моей грамматики:Добавить EObject к дереву синтаксического анализа programaticaly

Sort: 
name=ID 
; 
Variable 
name=ID ':' type=[Sort] 

Мое требование иметь предустановленный Сортировать давайте называть его Loc. Пользователю не нужно определять этот вид, поэтому, когда переменная Variable определена с типом Loc, Xtext должен автоматически ссылаться на мой предопределенный Сортировка. Как я могу запустить программу так, чтобы вначале был создан экземпляр Sort? Я уже использовал метод Factory 'CreateSort' в моем валидаторе, но не использовал. Есть идеи?

ответ

1

Ваша интуиция с помощью метода createSort Factory хороша, но вы должны позвонить ей в нужное время. Код Loc экземпляр должен быть создан до этапа привязки. Для этого вам необходимо привязать пользовательский компоновщик и переопределить его.

public class CustomLinker extends LazyLinker { 

    @Override 
    protected void beforeModelLinked(EObject model, 
      IDiagnosticConsumer diagnosticsConsumer) { 
     super.beforeModelLinked(model, diagnosticsConsumer); 
     if (model instanceof Root) { 
      Root root = (Root) model; 
      Sort locSort = MyDslFactory.eINSTANCE.createSort(); 
      locSort.setName("Loc"); 
      root.getContent().add(locSort); 
     } 
    } 
} 

Затем связать этот пользовательский класс компоновщика в режиме исполнения модуля:

public class MyDslRuntimeModule extends org.xtext.example.mydsl.AbstractMyDslRuntimeModule { 

    @Override 
    public Class<? extends ILinker> bindILinker() { 
     return CustomLinker.class; 
    } 
} 

Теперь вы можете написать файл, содержащий

переменной: Loc

Справочной будут решены.

+0

Tnx man, я собираюсь попробовать это решение, просто чтобы понять, что такое «Программа»? Это относится к моему правилу грамматики? – ye9ane

+0

Да, я отредактировал свой ответ, следовательно. –