2011-12-05 58 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