关注我的问题: here 我正在尝试自定义范围。我希望在' Predicate'的范围内在我的语言中,一些对象将在范围内可见,类型如' typeDef'。
Predicate:
'predicate' name=ID ('(' params=TypedParamList ')')?
(':' body=TemporalExpression TOK_SEMI)
| ('{' body=TemporalExpression '}');
TypeDef:
'type' name=ID '=' type=VarType TOK_SEMI;
以下是我语言的一些示例:
type
move = {left, right};
predicate stop(move m1, move m2) :
m1=left and m2=right;
它无法识别左右。(无法解析参考)
我试过这样的事情:
val allContentsCurrFile = EcoreUtil2.eAllOfType(context,TypeDef)
val allContentsCurrFile2 = EcoreUtil2.getAllContentsOfType(context,TypeDef)
我把它作为参数添加到Scopes.scopeFor方法(除了Predicate的参数之外),这对我来说并不适用。我不知道如何操作,如何在当前文件中查找特定类型的所有实例,以便交叉引用可以在Predicate范围内工作。
感谢。
答案 0 :(得分:0)
在走路之前,你必须走到离路的根部。 EcoreUtil2.getContainerOfType(context, YourRootType)
可能有助于此。
更新
语法和示例模型不合适,但这似乎是一个完全不同的问题,所以我只能给出一些提示。
您只能引用命名元素将这些元素放入范围。
语法:
TypedParam:
(module=[Import] '.')? type=[TypeDef] name=ID;
Referrable:
TypedParam | TypeDef | TypeConstant;
代码:
val root = EcoreUtil2.getContainerOfType(context, Domainmodel)
val allContentsCurrFile = EcoreUtil2.getAllContentsOfType(root,TypeConstant)