以下は私のDSLのXtext文法です。
Model:
variableTypes=VariableTypes predicateTypes=PredicateTypes variableDeclarations=
VariableDeclarations rules=Rules;
VariableType:
name=ID;
VariableTypes:
'var types' (variableTypes+=VariableType)+;
PredicateTypes:
'predicate types' (predicateTypes+=PredicateType)+;
PredicateType:
name=ID '(' (variableTypes+=[VariableType|ID])+ ')';
VariableDeclarations:
'vars' (variableDeclarations+=VariableDeclaration)+;
VariableDeclaration:
name=ID ':' type=[VariableType|ID];
Rules:
'rules' (rules+=Rule)+;
Rule:
head=Head ':-' body=Body;
Head:
predicate=Predicate;
Body:
(predicates+=Predicate)+;
Predicate:
predicateType=[PredicateType|ID] '(' (terms+=Term)+ ')';
Term:
variable=Variable;
Variable:
variableDeclaration=[VariableDeclaration|ID];
terminal WS:
(' ' | '\t' | '\r' | '\n' | ',')+;
そして、以下は上記DSLのプログラムです。
var types
Node
predicate types
Edge(Node, Node)
Path(Node, Node)
vars
x : Node
y : Node
z : Node
rules
Path(x, y) :- Edge(x, y)
Path(x, y) :- Path(x, z) Path(z, y)
以下は、生成されたクラスのサブクラスであり、ノードでnullを返すSwitch
ことを示しています。getPredicateType()
Predicate
public class ModelPrinter extends MyDSLSwitch<Object> {
protected Object visitChildren(EObject object) {
for (EObject eobj : object.eContents()) {
doSwitch(eobj);
}
return object;
}
@Override
public Object casePredicate(Predicate object) {
System.out.println(object.getPredicateType());
return object;
}
@Override
public Object defaultCase(EObject object) {
return visitChildren(object);
}
}
このクラスを使用しModelPrinter
て、上記のプログラムに対応するEMFオブジェクトモデルをトラバースすると、ノードが適切にリンクされていないことに気付きました。たとえば、ノードのgetPredicateType()
メソッドはを返します。Xtextユーザーガイドを読んだ後、私の印象では、Xtextのデフォルトのリンクセマンティクスは私のDSLで機能するはずです。しかし、何らかの理由で、DSLのASTノードが適切にリンクされていません。誰かがこの問題を診断するのを手伝ってくれますか?Predicate
null