Почему ссылки не работают в моем DSL на основе Xtext? - PullRequest
1 голос
/ 02 мая 2010

Ниже приведена грамматика Xtext для моего 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:
  (' ' | '\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)

Ниже приведен мой подкласс сгенерированного класса 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() на узле Predicate возвращает null. После прочтения руководства пользователя Xtext у меня сложилось впечатление, что семантика компоновки Xtext по умолчанию должна работать для моего DSL. Но по какой-то причине узлы AST моего DSL не связаны должным образом. Может кто-нибудь помочь мне в диагностике этой проблемы?

Ответы [ 2 ]

1 голос
/ 03 мая 2010

Наконец-то я разобрался с проблемой.Ссылки не были установлены должным образом, потому что я не загружал модель должным образом.Я только что использовал парсер для загрузки модели.Так что я не получил ссылки.Поэтому для правильной загрузки модели я использовал следующий фрагмент кода из Xtext FAQ .Затем я передал возвращенную модель своему классу коммутатора.

// "workspace" is a string that contains the path to the workspace containing the DSL program.
new org.eclipse.emf.mwe.utils.StandaloneSetup().setPlatformUri(workspace);

Injector injector = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration();
XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE);

// "DSLProgram" is a string that contains the path to the file of the DSL program relative to the workspace set above.
Resource resource = resourceSet.getResource(URI.createURI("platform:/resource/" + DSLProgram), true);
Model model = (Model) resource.getContents().get(0);
0 голосов
/ 02 мая 2010

Я опробовал его, но я не знаком с коммутатором, я скорее использовал Xpand / Xtend для доступа к Предикатным типам из Предиката и генерировал их имена.

Template.xpt:

«IMPORT myDsl»;

«DEFINE main FOR Model-»
«FILE "output.txt"-»
«FOREACH this.rules.rules.body.last().predicates AS p-»
«p.predicateType.name»
«ENDFOREACH-»
«ENDFILE-»
«ENDDEFINE»

и output.txt:

Path
Path

Полагаю, это ожидаемое поведение.

...