Как получить доступ к контекстной информации в валидаторе Xtext?

У меня есть грамматика Xtext, которая делает что-то вроде этого:

Model:
  (names += Name)*
  (rules += Rule)*
;

Rule:
  'rule' ruleName = ID;

Name:
  name = ID+;

terminal ID:
  ('a'..'z')+;

Я хочу проверить, что ruleName было объявлено в блоке имен. Я могу получить доступ к самому имени правила в JavaValidator следующим образом:

@Check
public void checkName(Rule rule) {
  rule.getName(); // how to compare to names without access to Model object?
}

но я не могу получить доступ к полю names из Model. Как мне это сделать в JavaValidator?


person Jorn    schedule 05.12.2011    source источник
comment
Извините, если пример грамматики не компилируется, я просто написал его в качестве примера. При этом основная мысль должна быть ясна.   -  person Jorn    schedule 05.12.2011


Ответы (2)


в качестве альтернативы (Model)rule.eContainer() должен дать вам модель

person Christian Dietrich    schedule 06.12.2011

Если вам не обязательно определять Name как терминал, рассмотрите возможность использования перекрестные ссылки:

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

generate secrets "http://www.example.org/yourdsl"

Model:
  (names += Name)*
  (rules += Rule)*
;

Name:
  name=ID; // name of the property is important!
Rule:
  'rule' name=[Name];

// Override ID from org.eclipse.xtext.common.Terminals
terminal ID:
  ('a'..'z')+;
person Eldar Abusalimov    schedule 05.12.2011
comment
Я не это имел в виду, но я вижу, как вы могли бы так подумать. Я отредактировал свою грамматику для ясности. - person Jorn; 05.12.2011