| //===-- macro-tokenizer.h - tokenizer helper for godumpspec ---------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Defines MacroTokenizer class |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef MACRO_TOKENIZER_H |
| #define MACRO_TOKENIZER_H |
| |
| #include <assert.h> |
| #include <string> |
| #include <sstream> |
| |
| typedef enum { |
| TOK_END_OF_STRING, |
| TOK_IDENTIFIER, |
| TOK_NUMERIC_CONSTANT, |
| TOK_STRING_CONSTANT, |
| TOK_OPEN_PAREN, |
| TOK_CLOSE_PAREN, |
| TOK_ADDSUB, |
| TOK_BINOP, |
| TOK_UNOP, |
| TOK_SPACE, |
| TOK_ERROR |
| } MacTokenTyp; |
| |
| // This helper class is used as part of the macro parsing code within |
| // llvm-godumpspec. Given a string presumably corresponding to the |
| // right hand side (body) of a macro, it walks through the string and |
| // breaks it up into tokens (identifiers, constants, parens, etc) |
| // which are then returned to the client via a 'getToken' interface. |
| // See the associated unit test for examples. |
| |
| class MacroTokenizer { |
| public: |
| // Initialize tokenizer with a given input string string. |
| explicit MacroTokenizer(const std::string &ins) |
| : in_(ins), |
| pos_(0u), |
| len_(ins.size()) |
| { |
| } |
| |
| // Return next token from string (or TOK_END_OF_STRING if we run out). |
| std::pair<MacTokenTyp, std::string> getToken(); |
| |
| private: |
| explicit MacroTokenizer(const char *str); |
| |
| bool done() { |
| return pos_ >= len_; |
| } |
| |
| char cur() const { |
| return in_[pos_]; |
| } |
| char next(unsigned k) const { |
| if (pos_ + k >= len_) |
| return '\0'; |
| return in_[pos_+k]; |
| } |
| char prev(unsigned k) const { |
| if (k > pos_ || pos_-k >= len_) |
| return '\0'; |
| return in_[pos_-k]; |
| } |
| |
| std::string consume1() { |
| std::string r; |
| r += cur(); |
| pos_ += 1; |
| return r; |
| } |
| |
| void consume1ss(std::stringstream &ss) { |
| ss << cur(); |
| pos_ += 1; |
| } |
| |
| std::string consumeN(unsigned n) { |
| assert(pos_ + n < len_); |
| std::string r(in_.substr(pos_, n)); |
| pos_ += n; |
| return r; |
| } |
| |
| template<typename TestCharFcn> |
| std::string consume(TestCharFcn testchar) |
| { |
| std::string result; |
| assert(!done()); |
| assert(testchar(cur())); |
| while (!done() && testchar(cur())) { |
| result += cur(); |
| pos_ += 1; |
| } |
| return result; |
| } |
| |
| private: |
| const std::string &in_; |
| std::string out_; |
| unsigned pos_; |
| unsigned len_; |
| }; |
| |
| #endif // MACRO_TOKENIZER_H |