Наследование типов в xtext

В рамках курса в моем университете мне нужно построить простой DSL с использованием XText. В настоящее время у меня проблема с проверкой статического типа. Предположим, у меня есть два типа переменных в моем языке: круг и треугольник. Оба имеют свой собственный набор параметров, таких как, например. радиус или высота/ширина. Однако у обоих есть общие параметры, такие как x/y (позиция). Поэтому я должен выполнить следующий код xtext:

//CircleAttributesInit makes sure, that the correct parameter are used
CircleDecl:
    'circle' name = ID '(' (attributes += CircleAttributesInit)* ')'
;

//triangleAttributesInit makes sure, that the correct parameter are used
TriangleDecl:
    'triangle' name = ID '(' (attributes += triangleAttributesInit)* ')'
;

CircleAccess returns INT:
    circle = [CircleDecl] '.' ('radius') 
;

TriangleAccess returns INT:
    triangle = [TriangleDecl] '.' ('height' | 'width') 
;

ObjectDecl:
    name = (CircleDecl | TriangleDecl)
;

ObjectAccess returns INT:
    objName = [ObjectDecl] '.' ('x' | 'y')
;

В моей простой программе теперь я могу ввести что-то вроде:

triangle tri (...)
circle  c (...)
tri.height = ...
c.radius = ...

но доступ к переменным супертипа, например:

tri.x = ....
c.y =....

не работает. Сообщение об ошибке: «Не удалось разрешить ссылку на ObjectDecl 'tri/c'». Для меня это имеет смысл, поскольку я никогда не говорил xtext, что каждый объект TriangleDecl/CircleDecl также является ObjectDecl. Но как мне это сделать?


person user1228633    schedule 01.02.2014    source источник


Ответы (1)


похоже, вы перепутали некоторые метауровни. пока атрибуты существуют только на уровне синтаксиса, вам нужно позаботиться о себе

person Christian Dietrich    schedule 05.02.2014
comment
Похоже, вы правы - я переделал всю грамматику, и теперь она работает :-) - person user1228633; 07.02.2014