2011-10-17 46 views
8

Tôi đang tìm một ví dụ (trong XText) về cách triển khai hoàn thành mã trên một thành viên đối tượng được xác định bởi người dùng. Theo như tôi có thể thấy tôi cần phải sử dụng IScope, nhưng làm thế nào tất cả các dây này lại với nhau là không rõ ràng.Ví dụ Xtext của một đối tượng có phạm vi

Cho rằng trait là loại do người dùng xác định, làm cách nào để xây dựng ngữ pháp để mã hoàn tất/xác thực các phương thức chứa trong String khi tôi nhập name.?

trait String { 
    def toLowerCase(): String 
    def toUpperCase(): String 
} 

val name = new String() 
name.toLowerCase() 

Cảm ơn

Trả lời

17

Nó rất phụ thuộc vào ngữ pháp của bạn những gì bạn phải làm gì để áp dụng Phạm vi. Chúng ta hãy nói rằng bạn có một ngữ pháp như

Model: 
    statements+=Statement+ 
; 

Statement: 
    Trait | VarDef | Call 
; 

Trait: 
    "trait" name=ID "{" 
     ops+=Operation* 
    "}" 
; 

Operation: 
    "def" name=ID "()" ":" type=[Trait] 
; 

VarDef: 
    "val" name=ID "=" "new" type=[Trait] "()" 
; 

Call: 
    var=[VarDef] "." op=[Operation] "()" 
; 

sau đó scopeprovider của bạn sẽ trông như thế

public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider { 

    IScope scope_Call_op(Call call, EReference ref) { 
     return Scopes.scopeFor(call.getVar().getType().getOps()); 
    } 
}  

Bạn có thể tìm thấy một loạt blog trên các chủ đề ở đây:

https://web.archive.org/web/20130129085620/http://blogs.itemis.de/stundzig/archives/773

+0

Tuyệt vời, cảm ơn Christian chính xác kickstart tôi cần;) –

+5

Đối với những người không biết gì về EMF như tôi, bạn có thể tìm thấy hữu ích EcoreUtil.getObjectsByType nếu bạn cần phải tự đi qua DSL của bạn bởi vì những gì bạn muốn tham khảo không thể dễ dàng thu được thông qua các phương thức get. ví dụ. Bạn có bộ sưu tập của các đối tượng không đồng nhất mà bạn cần phải phạm vi trên. – Bae

Các vấn đề liên quan