85static std::optional<llvm::StringRef> 
IsNumber(llvm::StringRef &remainder,
 
   87  llvm::StringRef tail = remainder;
 
   89  size_t dots = body.count(
'.');
 
   90  if (dots > 1 || dots == body.size())
 
   92  if (
IsDigit(body.front()) || (body[0] == 
'.' && 
IsDigit(body[1]))) {
 
   94    tail = tail.drop_front(body.size());
 
   95    bool isHex = body.contains_insensitive(
'x');
 
   96    bool hasExp = !isHex && body.contains_insensitive(
'e');
 
   97    bool hasHexExp = isHex && body.contains_insensitive(
'p');
 
   98    if (hasExp || hasHexExp) {
 
  100      if (body.ends_with_insensitive(
"e") || body.ends_with_insensitive(
"p"))
 
  101        if (tail.consume_front(
"+") || tail.consume_front(
"-"))
 
  104    size_t number_length = remainder.size() - tail.size();
 
  105    llvm::StringRef number = remainder.take_front(number_length);
 
  106    remainder = remainder.drop_front(number_length);
 
 
  113  std::vector<Token> tokens;
 
  114  llvm::StringRef remainder = expr;
 
  116    if (llvm::Expected<Token> t = 
Lex(expr, remainder)) {
 
  117      tokens.push_back(std::move(*t));
 
  119      return t.takeError();
 
  121  } 
while (tokens.back().GetKind() != 
Token::eof);
 
  122  return DILLexer(expr, std::move(tokens));
 
 
  126                                    llvm::StringRef &remainder) {
 
  128  remainder = remainder.ltrim();
 
  129  llvm::StringRef::iterator cur_pos = remainder.begin();
 
  132  if (remainder.empty())
 
  135  uint32_t position = cur_pos - expr.begin();
 
  136  bool isFloat = 
false;
 
  137  std::optional<llvm::StringRef> maybe_number = 
IsNumber(remainder, isFloat);
 
  140    return Token(kind, maybe_number->str(), position);
 
  142  std::optional<llvm::StringRef> maybe_word = 
IsWord(expr, remainder);
 
  144    llvm::StringRef word = *maybe_word;
 
  145    Token::Kind kind = llvm::StringSwitch<Token::Kind>(word)
 
  149    return Token(kind, word.str(), position);
 
  152  constexpr std::pair<Token::Kind, const char *> operators[] = {
 
  158  for (
auto [kind, str] : operators) {
 
  159    if (remainder.consume_front(str))
 
  160      return Token(kind, str, position);
 
  164  return llvm::make_error<DILDiagnosticError>(expr, 
"unrecognized token",