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 {
@@ -31,10 +32,16 @@ llvm::StringRef Token::GetTokenName(Kind kind) {
3132 return " identifier" ;
3233 case Kind::l_paren:
3334 return " l_paren" ;
35+ case Kind::l_square:
36+ return " l_square" ;
37+ case Kind::numeric_constant:
38+ return " numeric_constant" ;
3439 case Kind::period:
3540 return " period" ;
3641 case Kind::r_paren:
3742 return " r_paren" ;
43+ case Kind::r_square:
44+ return " r_square" ;
3845 case Token::star:
3946 return " star" ;
4047 }
@@ -61,6 +68,18 @@ static std::optional<llvm::StringRef> IsWord(llvm::StringRef expr,
6168 return candidate;
6269}
6370
71+ static bool IsNumberBodyChar (char ch) { return IsDigit (ch) || IsLetter (ch); }
72+
73+ static std::optional<llvm::StringRef> IsNumber (llvm::StringRef expr,
74+ llvm::StringRef &remainder) {
75+ if (IsDigit (remainder[0 ])) {
76+ llvm::StringRef number = remainder.take_while (IsNumberBodyChar);
77+ remainder = remainder.drop_front (number.size ());
78+ return number;
79+ }
80+ return std::nullopt ;
81+ }
82+
6483llvm::Expected<DILLexer> DILLexer::Create (llvm::StringRef expr) {
6584 std::vector<Token> tokens;
6685 llvm::StringRef remainder = expr;
@@ -85,22 +104,26 @@ llvm::Expected<Token> DILLexer::Lex(llvm::StringRef expr,
85104 return Token (Token::eof, " " , (uint32_t )expr.size ());
86105
87106 uint32_t position = cur_pos - expr.begin ();
107+ std::optional<llvm::StringRef> maybe_number = IsNumber (expr, remainder);
108+ if (maybe_number)
109+ return Token (Token::numeric_constant, maybe_number->str (), position);
88110 std::optional<llvm::StringRef> maybe_word = IsWord (expr, remainder);
89111 if (maybe_word)
90112 return Token (Token::identifier, maybe_word->str (), position);
91113
92114 constexpr std::pair<Token::Kind, const char *> operators[] = {
93- {Token::amp, " &" }, {Token::arrow, " ->" }, {Token::coloncolon, " ::" },
94- {Token::l_paren, " (" }, {Token::period , " . " }, {Token::r_paren , " ) " },
95- {Token::star, " *" },
115+ {Token::amp, " &" }, {Token::arrow, " ->" }, {Token::coloncolon, " ::" },
116+ {Token::l_paren, " (" }, {Token::l_square , " [ " }, {Token::period , " . " },
117+ {Token::r_paren, " ) " }, {Token::r_square, " ] " }, {Token:: star, " *" },
96118 };
97119 for (auto [kind, str] : operators) {
98120 if (remainder.consume_front (str))
99121 return Token (kind, str, position);
100122 }
101123
102124 // Unrecognized character(s) in string; unable to lex it.
103- return llvm::createStringError (" Unable to lex input string" );
125+ return llvm::make_error<DILDiagnosticError>(expr, " unrecognized token" ,
126+ position);
104127}
105128
106129} // namespace lldb_private::dil
0 commit comments