parsePrimary method

Expression parsePrimary()

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