parsePrimary method
A number, a parenthesis, a constructor, a call or a name.
Implementation
Expression parsePrimary() {
if (skipIf('(')) {
final inner = parseExpression();
expectToken(')', '")"');
return inner;
}
if (current.kind == 'number') {
final token = expectToken('number', 'a number');
if (current.kind == 'unit') {
return quantity(token, expectToken('unit', ''));
}
return ExpressionConstant(<double>[token.number!], ExpressionType.float);
}
if (current.kind != 'name') {
fail('expected a value, found "${current.text}".');
}
final token = expectToken('name', 'a value');
final name = token.text;
if (syntax.logic && (name == 'true' || name == 'false')) {
return ExpressionConstant(<double>[
name == 'true' ? 1 : 0,
], ExpressionType.boolean);
}
for (final type in ExpressionType.numeric.values) {
if (type.name == name) return construct(type, token);
}
if (parseSpecialCall(token) case final special?) return special;
final builtin = builtinNamed(name);
if (builtin != null) return call(builtin, token);
return resolveName(token);
}