В рамках курса в моем университете мне нужно построить простой 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. Но как мне это сделать?