87static std::optional<llvm::StringRef>
IsNumber(llvm::StringRef &remainder,
89 llvm::StringRef tail = remainder;
91 size_t dots = body.count(
'.');
92 if (dots > 1 || dots == body.size())
94 if (
IsDigit(body.front()) || (body[0] ==
'.' &&
IsDigit(body[1]))) {
96 tail = tail.drop_front(body.size());
97 bool isHex = body.contains_insensitive(
'x');
98 bool hasExp = !isHex && body.contains_insensitive(
'e');
99 bool hasHexExp = isHex && body.contains_insensitive(
'p');
100 if (hasExp || hasHexExp) {
102 if (body.ends_with_insensitive(
"e") || body.ends_with_insensitive(
"p"))
103 if (tail.consume_front(
"+") || tail.consume_front(
"-"))
106 size_t number_length = remainder.size() - tail.size();
107 llvm::StringRef number = remainder.take_front(number_length);
108 remainder = remainder.drop_front(number_length);
115 std::vector<Token> tokens;
116 llvm::StringRef remainder = expr;
118 if (llvm::Expected<Token> t =
Lex(expr, remainder)) {
119 tokens.push_back(std::move(*t));
121 return t.takeError();
123 }
while (tokens.back().GetKind() !=
Token::eof);
124 return DILLexer(expr, std::move(tokens));
128 llvm::StringRef &remainder) {
130 remainder = remainder.ltrim();
131 llvm::StringRef::iterator cur_pos = remainder.begin();
134 if (remainder.empty())
137 uint32_t position = cur_pos - expr.begin();
138 bool isFloat =
false;
139 std::optional<llvm::StringRef> maybe_number =
IsNumber(remainder, isFloat);
142 return Token(kind, maybe_number->str(), position);
144 std::optional<llvm::StringRef> maybe_word =
IsWord(expr, remainder);
146 llvm::StringRef word = *maybe_word;
147 Token::Kind kind = llvm::StringSwitch<Token::Kind>(word)
151 return Token(kind, word.str(), position);
154 constexpr std::pair<Token::Kind, const char *> operators[] = {
160 for (
auto [kind, str] : operators) {
161 if (remainder.consume_front(str))
162 return Token(kind, str, position);
166 return llvm::make_error<DILDiagnosticError>(expr,
"unrecognized token",