parser top-level property
Implementation
final parser = () {
final builder = ExpressionBuilder<Expression>();
builder
..primitive(
(digit().plus() &
(char('.') & digit().plus()).optional() &
(pattern('eE') & pattern('+-').optional() & digit().plus())
.optional())
.flatten(message: 'number expected')
.trim()
.map(_createValue),
)
..primitive(
seq2(
seq2(letter(), word().star()).flatten(message: 'name expected').trim(),
seq3(
char('(').trim(),
builder.loopback
.starSeparated(char(',').trim())
.map((list) => list.elements),
char(')').trim(),
).map3((_, list, _) => list).optionalWith(const <Expression>[]),
).map2((name, args) => _createBinding(name, args)),
);
builder.group().wrapper(
char('(').trim(),
char(')').trim(),
(left, value, right) => value,
);
builder.group()
..prefix(char('+').trim(), (op, a) => a)
..prefix(char('-').trim(), (op, a) => Application('-', [a], (x) => -x));
builder.group().right(
char('^').trim(),
(a, op, b) => Application('^', [a, b], math.pow),
);
builder.group()
..left(
char('*').trim(),
(a, op, b) => Application('*', [a, b], (x, y) => x * y),
)
..left(
char('/').trim(),
(a, op, b) => Application('/', [a, b], (x, y) => x / y),
);
builder.group()
..left(
char('+').trim(),
(a, op, b) => Application('+', [a, b], (x, y) => x + y),
)
..left(
char('-').trim(),
(a, op, b) => Application('-', [a, b], (x, y) => x - y),
);
return resolve(builder.build()).end();
}();