The following is the Xtext grammar for my DSL.
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:
( | |
|
| , )+;
And, the following is a program in the above 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)
The following is my subclass of the generated Switch
class that demonstrates the getPredicateType()
returns null on a Predicate
node.
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);
}
}
When I used the ModelPrinter
class to traverse the EMF object model corresponding to the above program, I realized that the nodes are not linked together properly. For example, the getPredicateType()
method on a Predicate
node returns null
. Having read the Xtext user s guide, my impression is that the Xtext default linking semantics should work for my DSL. But, for some reason, the AST nodes of my DSL don t get linked together properly. Can anyone help me in diagnosing this problem?