2011-12-05 33 views
1

我有一个语法的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? 
} 

,但我无法从Model访问names领域。我如何在JavaValidator中做到这一点?

+0

很抱歉,如果该示例语法不能编译,我只是以此为例。主要想法应该清楚。 – Jorn

回答

2

或者(Model)rule.eContainer()应该给你的模型

+0

谢谢,我会尝试! – Jorn

0

如果不强制你定义Name终端,则可以考虑使用cross-references

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')+; 
+0

这不是我的意思,但我明白你会怎么想。为了清晰起见,我编辑了我的语法。 – Jorn