binaryExpression property

Parser<Expression> get binaryExpression

Implementation

Parser<Expression> get binaryExpression =>
    token.plusSeparated(binaryOperation).map((sl) {
      var l = sl.sequential.toList();

      var first = l[0];
      var stack = <dynamic>[first];

      for (var i = 1; i < l.length; i += 2) {
        var op = l[i];
        var prec = BinaryExpression.precedenceForOperator(op);

        // Reduce: make a binary expression from the three topmost entries.
        while ((stack.length > 2) &&
            (prec <=
                BinaryExpression.precedenceForOperator(
                    stack[stack.length - 2]))) {
          var right = stack.removeLast();
          var op = stack.removeLast();
          var left = stack.removeLast();
          var node = BinaryExpression(op, left, right);
          stack.add(node);
        }

        var node = l[i + 1];
        stack.addAll([op, node]);
      }

      var i = stack.length - 1;
      var node = stack[i];
      while (i > 1) {
        node = BinaryExpression(stack[i - 1], stack[i - 2], node);
        i -= 2;
      }
      return node;
    });