Дерево Coffeescript расширяет класс, который не работает

#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();