]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/Plugins/ExpressionParser/Go/GoLexer.h
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / source / Plugins / ExpressionParser / Go / GoLexer.h
1 //===-- GoLexer.h -----------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef liblldb_GoLexer_h
11 #define liblldb_GoLexer_h
12
13 #include "llvm/ADT/StringMap.h"
14 #include "llvm/ADT/StringRef.h"
15
16 namespace lldb_private {
17
18 class GoLexer {
19 public:
20   explicit GoLexer(const char *src);
21
22   enum TokenType {
23     TOK_EOF,
24     TOK_INVALID,
25     TOK_IDENTIFIER,
26     LIT_INTEGER,
27     LIT_FLOAT,
28     LIT_IMAGINARY,
29     LIT_RUNE,
30     LIT_STRING,
31     KEYWORD_BREAK,
32     KEYWORD_DEFAULT,
33     KEYWORD_FUNC,
34     KEYWORD_INTERFACE,
35     KEYWORD_SELECT,
36     KEYWORD_CASE,
37     KEYWORD_DEFER,
38     KEYWORD_GO,
39     KEYWORD_MAP,
40     KEYWORD_STRUCT,
41     KEYWORD_CHAN,
42     KEYWORD_ELSE,
43     KEYWORD_GOTO,
44     KEYWORD_PACKAGE,
45     KEYWORD_SWITCH,
46     KEYWORD_CONST,
47     KEYWORD_FALLTHROUGH,
48     KEYWORD_IF,
49     KEYWORD_RANGE,
50     KEYWORD_TYPE,
51     KEYWORD_CONTINUE,
52     KEYWORD_FOR,
53     KEYWORD_IMPORT,
54     KEYWORD_RETURN,
55     KEYWORD_VAR,
56     OP_PLUS,
57     OP_MINUS,
58     OP_STAR,
59     OP_SLASH,
60     OP_PERCENT,
61     OP_AMP,
62     OP_PIPE,
63     OP_CARET,
64     OP_LSHIFT,
65     OP_RSHIFT,
66     OP_AMP_CARET,
67     OP_PLUS_EQ,
68     OP_MINUS_EQ,
69     OP_STAR_EQ,
70     OP_SLASH_EQ,
71     OP_PERCENT_EQ,
72     OP_AMP_EQ,
73     OP_PIPE_EQ,
74     OP_CARET_EQ,
75     OP_LSHIFT_EQ,
76     OP_RSHIFT_EQ,
77     OP_AMP_CARET_EQ,
78     OP_AMP_AMP,
79     OP_PIPE_PIPE,
80     OP_LT_MINUS,
81     OP_PLUS_PLUS,
82     OP_MINUS_MINUS,
83     OP_EQ_EQ,
84     OP_LT,
85     OP_GT,
86     OP_EQ,
87     OP_BANG,
88     OP_BANG_EQ,
89     OP_LT_EQ,
90     OP_GT_EQ,
91     OP_COLON_EQ,
92     OP_DOTS,
93     OP_LPAREN,
94     OP_LBRACK,
95     OP_LBRACE,
96     OP_COMMA,
97     OP_DOT,
98     OP_RPAREN,
99     OP_RBRACK,
100     OP_RBRACE,
101     OP_SEMICOLON,
102     OP_COLON,
103   };
104
105   struct Token {
106     explicit Token(TokenType t, llvm::StringRef text)
107         : m_type(t), m_value(text) {}
108     TokenType m_type;
109     llvm::StringRef m_value;
110   };
111
112   const Token &Lex();
113
114   size_t BytesRemaining() const { return m_end - m_src; }
115   llvm::StringRef GetString(int len) const {
116     return llvm::StringRef(m_src, len);
117   }
118
119   static TokenType LookupKeyword(llvm::StringRef id);
120   static llvm::StringRef LookupToken(TokenType t);
121
122 private:
123   bool IsDecimal(char c) { return c >= '0' && c <= '9'; }
124   bool IsHexChar(char c) {
125     if (c >= '0' && c <= '9')
126       return true;
127     if (c >= 'A' && c <= 'F')
128       return true;
129     if (c >= 'a' && c <= 'f')
130       return true;
131     return false;
132   }
133   bool IsLetterOrDigit(char c) {
134     if (c >= 'a' && c <= 'z')
135       return true;
136     if (c >= 'A' && c <= 'Z')
137       return true;
138     if (c == '_')
139       return true;
140     if (c >= '0' && c <= '9')
141       return true;
142     // Treat all non-ascii chars as letters for simplicity.
143     return 0 != (c & 0x80);
144   }
145   bool IsWhitespace(char c) {
146     switch (c) {
147     case ' ':
148     case '\t':
149     case '\r':
150       return true;
151     }
152     return false;
153   }
154
155   bool SkipWhitespace();
156   bool SkipComment();
157
158   TokenType InternalLex(bool newline);
159
160   TokenType DoOperator();
161
162   TokenType DoIdent();
163
164   TokenType DoNumber();
165
166   TokenType DoRune();
167
168   TokenType DoString();
169
170   static llvm::StringMap<TokenType> *InitKeywords();
171
172   static llvm::StringMap<TokenType> *m_keywords;
173
174   const char *m_src;
175   const char *m_end;
176   Token m_last_token;
177 };
178
179 } // namespace lldb_private
180
181 #endif