variable method
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;
});