simpleExpression method

Parser<ExpressionNode> simpleExpression()

Implementation

Parser<ExpressionNode> simpleExpression() =>
    seq2(
      [ref1(token, '+'), ref1(token, '-')].toChoiceParser().optional(),
      ref0(term).plusSeparated(ref1(token, 'or')),
    ).plus().map((list) {
      ExpressionNode? result;
      for (final (prefix, termsSep) in list) {
        final terms = termsSep.elements;
        var termExpr = terms.first;
        for (var i = 1; i < terms.length; i++) {
          termExpr = BinaryExpressionNode(
            operator: 'or',
            left: termExpr,
            right: terms[i],
          );
        }
        if (prefix != null) {
          termExpr = UnaryExpressionNode(operator: prefix, operand: termExpr);
        }
        result = result == null
            ? termExpr
            : BinaryExpressionNode(
                operator: '+',
                left: result,
                right: termExpr,
              );
      }
      return result ?? (throw StateError('Expression expected'));
    });