Я делаю DSL-выражения с использованием Xtext и хочу, чтобы некоторые классы наследовали от некоторых абстрактных.Иерархия: выражение - это абстрактный класс, расширенный с помощью BinaryOperation, UnaryOperation, Number и Atomic.BinaryOperation - это абстрактный класс, расширенный с помощью Add, Sub, Mul, Div, Power. UnaryOperation - это абстрактный класс, расширенный с помощью UnaryPlus, UnaryMinus и Factorial.
Вся грамматика:
Expressions:
elements+=EvalExpr;
EvalExpr:
'eval' expression=Expression ';';
Expression: AddOrSub;
UnaryOperation:
Expression;
BinaryOperation:
Expression;
AddOrSub returns BinaryOperation:
MulOrDivOrPower (( {Add.left=current} '+' |
{Sub.left=current} '-'
) right=MulOrDivOrPower)*;
MulOrDivOrPower returns BinaryOperation:
UnaryPlusOrMinus (( {Mul.left=current} '*' |
{Div.left=current} '/' |
{Power.left=current} '^'
) right=UnaryPlusOrMinus)*;
UnaryPlusOrMinus returns UnaryOperation:
'-' {UnaryMinus} expression=Factorial | '+' {UnaryPlus} expression=Factorial | Factorial;
Factorial returns UnaryOperation:
Atomic ({Factorial.expression=current} '!')?;
Atomic returns Expression:
'(' Expression ')' | Number;
Number returns Expression:
{IntConstant} value=INT;
Но я 'Я вижу ошибку: класс не может быть супер типом самого себя.Как я могу предоставить такую функциональность?