//===-- GoLexer.h -----------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_GoLexer_h #define liblldb_GoLexer_h #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" namespace lldb_private { class GoLexer { public: explicit GoLexer(const char *src); enum TokenType { TOK_EOF, TOK_INVALID, TOK_IDENTIFIER, LIT_INTEGER, LIT_FLOAT, LIT_IMAGINARY, LIT_RUNE, LIT_STRING, KEYWORD_BREAK, KEYWORD_DEFAULT, KEYWORD_FUNC, KEYWORD_INTERFACE, KEYWORD_SELECT, KEYWORD_CASE, KEYWORD_DEFER, KEYWORD_GO, KEYWORD_MAP, KEYWORD_STRUCT, KEYWORD_CHAN, KEYWORD_ELSE, KEYWORD_GOTO, KEYWORD_PACKAGE, KEYWORD_SWITCH, KEYWORD_CONST, KEYWORD_FALLTHROUGH, KEYWORD_IF, KEYWORD_RANGE, KEYWORD_TYPE, KEYWORD_CONTINUE, KEYWORD_FOR, KEYWORD_IMPORT, KEYWORD_RETURN, KEYWORD_VAR, OP_PLUS, OP_MINUS, OP_STAR, OP_SLASH, OP_PERCENT, OP_AMP, OP_PIPE, OP_CARET, OP_LSHIFT, OP_RSHIFT, OP_AMP_CARET, OP_PLUS_EQ, OP_MINUS_EQ, OP_STAR_EQ, OP_SLASH_EQ, OP_PERCENT_EQ, OP_AMP_EQ, OP_PIPE_EQ, OP_CARET_EQ, OP_LSHIFT_EQ, OP_RSHIFT_EQ, OP_AMP_CARET_EQ, OP_AMP_AMP, OP_PIPE_PIPE, OP_LT_MINUS, OP_PLUS_PLUS, OP_MINUS_MINUS, OP_EQ_EQ, OP_LT, OP_GT, OP_EQ, OP_BANG, OP_BANG_EQ, OP_LT_EQ, OP_GT_EQ, OP_COLON_EQ, OP_DOTS, OP_LPAREN, OP_LBRACK, OP_LBRACE, OP_COMMA, OP_DOT, OP_RPAREN, OP_RBRACK, OP_RBRACE, OP_SEMICOLON, OP_COLON, }; struct Token { explicit Token(TokenType t, llvm::StringRef text) : m_type(t), m_value(text) {} TokenType m_type; llvm::StringRef m_value; }; const Token &Lex(); size_t BytesRemaining() const { return m_end - m_src; } llvm::StringRef GetString(int len) const { return llvm::StringRef(m_src, len); } static TokenType LookupKeyword(llvm::StringRef id); static llvm::StringRef LookupToken(TokenType t); private: bool IsDecimal(char c) { return c >= '0' && c <= '9'; } bool IsHexChar(char c) { if (c >= '0' && c <= '9') return true; if (c >= 'A' && c <= 'F') return true; if (c >= 'a' && c <= 'f') return true; return false; } bool IsLetterOrDigit(char c) { if (c >= 'a' && c <= 'z') return true; if (c >= 'A' && c <= 'Z') return true; if (c == '_') return true; if (c >= '0' && c <= '9') return true; // Treat all non-ascii chars as letters for simplicity. return 0 != (c & 0x80); } bool IsWhitespace(char c) { switch (c) { case ' ': case '\t': case '\r': return true; } return false; } bool SkipWhitespace(); bool SkipComment(); TokenType InternalLex(bool newline); TokenType DoOperator(); TokenType DoIdent(); TokenType DoNumber(); TokenType DoRune(); TokenType DoString(); static llvm::StringMap *InitKeywords(); static llvm::StringMap *m_keywords; const char *m_src; const char *m_end; Token m_last_token; }; } // namespace lldb_private #endif