variable method

Parser<ExpressionNode> variable()

Implementation

Parser<ExpressionNode> variable() =>
    seq2(
      ref0(identifier),
      [
        seq3(
          ref1(token, '['),
          ref0(expression)
              .plusSeparated(ref1(token, ','))
              .map((sep) => sep.elements),
          ref1(token, ']'),
        ).map3(
          (_, indices, _) => (indices: indices, field: null, isDeref: false),
        ),
        seq2(ref1(token, '.'), ref0(identifier)).map2(
          (_, field) => (
            indices: const <ExpressionNode>[],
            field: field,
            isDeref: false,
          ),
        ),
        ref1(token, '^').map(
          (_) =>
              (indices: const <ExpressionNode>[], field: null, isDeref: true),
        ),
      ].toChoiceParser().star(),
    ).map2((name, accessors) {
      ExpressionNode current = VariableExpressionNode(name);
      for (final acc in accessors) {
        if (acc.isDeref) {
          current = PointerDereferenceExpressionNode(current);
        } else if (acc.field case final field?) {
          current = FieldAccessExpressionNode(record: current, field: field);
        } else {
          current = ArrayAccessExpressionNode(
            array: current,
            indices: acc.indices,
          );
        }
      }
      return current;
    });