1313
1414#include " lldb/ValueObject/DILLexer.h"
1515#include " lldb/Utility/Status.h"
16+ #include " lldb/ValueObject/DILParser.h"
1617#include " llvm/ADT/StringSwitch.h"
1718
1819namespace lldb_private ::dil {
@@ -29,8 +30,14 @@ llvm::StringRef Token::GetTokenName(Kind kind) {
2930 return " identifier" ;
3031 case Kind::l_paren:
3132 return " l_paren" ;
33+ case Kind::l_square:
34+ return " l_square" ;
35+ case Kind::numeric_constant:
36+ return " numeric_constant" ;
3237 case Kind::r_paren:
3338 return " r_paren" ;
39+ case Kind::r_square:
40+ return " r_square" ;
3441 case Token::star:
3542 return " star" ;
3643 }
@@ -57,6 +64,18 @@ static std::optional<llvm::StringRef> IsWord(llvm::StringRef expr,
5764 return candidate;
5865}
5966
67+ static bool IsNumberBodyChar (char ch) { return IsDigit (ch) || IsLetter (ch); }
68+
69+ static std::optional<llvm::StringRef> IsNumber (llvm::StringRef expr,
70+ llvm::StringRef &remainder) {
71+ if (IsDigit (remainder[0 ])) {
72+ llvm::StringRef number = remainder.take_while (IsNumberBodyChar);
73+ remainder = remainder.drop_front (number.size ());
74+ return number;
75+ }
76+ return std::nullopt ;
77+ }
78+
6079llvm::Expected<DILLexer> DILLexer::Create (llvm::StringRef expr) {
6180 std::vector<Token> tokens;
6281 llvm::StringRef remainder = expr;
@@ -81,21 +100,26 @@ llvm::Expected<Token> DILLexer::Lex(llvm::StringRef expr,
81100 return Token (Token::eof, " " , (uint32_t )expr.size ());
82101
83102 uint32_t position = cur_pos - expr.begin ();
103+ std::optional<llvm::StringRef> maybe_number = IsNumber (expr, remainder);
104+ if (maybe_number)
105+ return Token (Token::numeric_constant, maybe_number->str (), position);
84106 std::optional<llvm::StringRef> maybe_word = IsWord (expr, remainder);
85107 if (maybe_word)
86108 return Token (Token::identifier, maybe_word->str (), position);
87109
88110 constexpr std::pair<Token::Kind, const char *> operators[] = {
89- {Token::amp, " &" }, {Token::coloncolon, " ::" }, {Token::l_paren, " (" },
90- {Token::r_paren, " )" }, {Token::star, " *" },
111+ {Token::amp, " &" }, {Token::coloncolon, " ::" }, {Token::l_paren, " (" },
112+ {Token::l_square, " [" }, {Token::r_paren, " )" }, {Token::r_square, " ]" },
113+ {Token::star, " *" },
91114 };
92115 for (auto [kind, str] : operators) {
93116 if (remainder.consume_front (str))
94117 return Token (kind, str, position);
95118 }
96119
97120 // Unrecognized character(s) in string; unable to lex it.
98- return llvm::createStringError (" Unable to lex input string" );
121+ return llvm::make_error<DILDiagnosticError>(expr, " unrecognized token" ,
122+ position);
99123}
100124
101125} // namespace lldb_private::dil
0 commit comments