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