范围对象的Xtext示例

时间:2011-10-17 09:37:15

标签: scope dsl xtext

我正在寻找一个如何在用户定义的对象成员上实现代码完成的示例(在XText中)。据我所知,我需要使用IScope,但是所有这些连接在一起的方式还不清楚。

鉴于trait是用户定义的类型,当我输入String时,如何构建语法来编码完成/验证name.中包含的方法?

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

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

由于

2 个答案:

答案 0 :(得分:17)

在很大程度上取决于你的语法,你需要做什么来采用范围。 我们假设你有一个像

这样的语法
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] "()"
;

然后你的scopeprovider看起来像

public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {

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

您可以在此处找到关于该主题的博客系列:

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

答案 1 :(得分:2)

在我关于Xtext的书中,"使用Xtext和Xtend实现特定于域的语言",https://www.packtpub.com/application-development/implementing-domain-specific-languages-xtext-and-xtend,有一章关于"较小"的范围。 Java语言(处理继承)。您可以在此处找到示例来源:https://github.com/LorenzoBettini/packtpub-xtext-book-examples