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",