#javascript #tree #coffeescript #extends
#javascript #дерево #coffeescript #расширяет
Вопрос:
Мне нужно создать дерево, которое, например, ВЫЧИСЛЯЕТ 2 числа. Я делаю в coffee script, который преобразует javascript из-за расширения класса.
class Expression
@Evaluate = -> 0
class Const extends Expression
constructor: (value)->
class BinaryOperation extends Expression
constructor: (L, R)->
class Add extends BinaryOperation
@Evaluate = -> L.Evaluate() R.Evaluate();
expr = new Add(new Const(10), new Const(10));
alert(expr.Evaluate())
Демонстрация:https://jsfiddle.net/f3ry/D9kBP/24/
Спасибо.
Комментарии:
1. Ни один из ваших подклассов на самом деле ничего не делает. И вы пытаетесь написать синтаксический анализатор на coffeescript, потому что …..?
Ответ №1:
Ваша проблема заключается в сочетании синтаксических ошибок и непонимании того, как работает разделение на подклассы. Это должно привести вас туда:
class Expression
Evaluate: () -> 0
class Const extends Expression
constructor: (@value) ->
Evaluate: () -> @value
class BinaryOperation extends Expression
constructor: (@L, @R)->
class Add extends BinaryOperation
Evaluate: -> @L.Evaluate() @R.Evaluate();
expr = new Add(new Const(10), new Const(10));
alert(expr.Evaluate())
Добавление @
в параметр конструктора устанавливает его как свойство вновь созданного объекта. Переопределение Evaluate
метода позволяет выполнять операции. 0
class Const extends Expression
constructor: (@value) ->
Evaluate: () -> @value
class BinaryOperation extends Expression
constructor: (@L, @R)->
class Add extends BinaryOperation
Evaluate: -> @L.Evaluate() + @R.Evaluate();
expr = new Add(new Const(10), new Const(10));
alert(expr.Evaluate())» rel=»nofollow»>Ссылка на пример.
Ответ №2:
Я создаю синтаксическое дерево с абстрактными классами. В python работает очень хорошо:
class Expression:
def Evaluate(self):
return 0;
class Const(Expression):
def __init__(self, nValue):
self.Value = nValue;
def Evaluate(self):
return self.Value;
class BinaryOperation(Expression):
def __init__(self, nL, nR):
self.L = nL;
self.R = nR;
class Add(BinaryOperation):
def Evaluate(self):
return self.L.Evaluate() self.R.Evaluate();