annotate gcc/go/gofrontend/lex.h @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // lex.h -- Go frontend lexer. -*- C++ -*-
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 // Copyright 2009 The Go Authors. All rights reserved.
kono
parents:
diff changeset
4 // Use of this source code is governed by a BSD-style
kono
parents:
diff changeset
5 // license that can be found in the LICENSE file.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #ifndef GO_LEX_H
kono
parents:
diff changeset
8 #define GO_LEX_H
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 #include <mpfr.h>
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 #include "operator.h"
kono
parents:
diff changeset
13 #include "go-linemap.h"
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 struct Unicode_range;
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 // The keywords. These must be in sorted order, other than
kono
parents:
diff changeset
18 // KEYWORD_INVALID. They must match the Keywords::mapping_ array in
kono
parents:
diff changeset
19 // lex.cc.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 enum Keyword
kono
parents:
diff changeset
22 {
kono
parents:
diff changeset
23 KEYWORD_INVALID, // Not a keyword.
kono
parents:
diff changeset
24 KEYWORD_ASM,
kono
parents:
diff changeset
25 KEYWORD_BREAK,
kono
parents:
diff changeset
26 KEYWORD_CASE,
kono
parents:
diff changeset
27 KEYWORD_CHAN,
kono
parents:
diff changeset
28 KEYWORD_CONST,
kono
parents:
diff changeset
29 KEYWORD_CONTINUE,
kono
parents:
diff changeset
30 KEYWORD_DEFAULT,
kono
parents:
diff changeset
31 KEYWORD_DEFER,
kono
parents:
diff changeset
32 KEYWORD_ELSE,
kono
parents:
diff changeset
33 KEYWORD_FALLTHROUGH,
kono
parents:
diff changeset
34 KEYWORD_FOR,
kono
parents:
diff changeset
35 KEYWORD_FUNC,
kono
parents:
diff changeset
36 KEYWORD_GO,
kono
parents:
diff changeset
37 KEYWORD_GOTO,
kono
parents:
diff changeset
38 KEYWORD_IF,
kono
parents:
diff changeset
39 KEYWORD_IMPORT,
kono
parents:
diff changeset
40 KEYWORD_INTERFACE,
kono
parents:
diff changeset
41 KEYWORD_MAP,
kono
parents:
diff changeset
42 KEYWORD_PACKAGE,
kono
parents:
diff changeset
43 KEYWORD_RANGE,
kono
parents:
diff changeset
44 KEYWORD_RETURN,
kono
parents:
diff changeset
45 KEYWORD_SELECT,
kono
parents:
diff changeset
46 KEYWORD_STRUCT,
kono
parents:
diff changeset
47 KEYWORD_SWITCH,
kono
parents:
diff changeset
48 KEYWORD_TYPE,
kono
parents:
diff changeset
49 KEYWORD_VAR
kono
parents:
diff changeset
50 };
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 // Pragmas built from magic comments and recorded for functions.
kono
parents:
diff changeset
53 // These are used as bits in a bitmask.
kono
parents:
diff changeset
54 // The set of values is intended to be the same as the gc compiler.
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 enum GoPragma
kono
parents:
diff changeset
57 {
kono
parents:
diff changeset
58 GOPRAGMA_NOINTERFACE = 1 << 0, // Method not in type descriptor.
kono
parents:
diff changeset
59 GOPRAGMA_NOESCAPE = 1 << 1, // Args do not escape.
kono
parents:
diff changeset
60 GOPRAGMA_NORACE = 1 << 2, // No race detector.
kono
parents:
diff changeset
61 GOPRAGMA_NOSPLIT = 1 << 3, // Do not split stack.
kono
parents:
diff changeset
62 GOPRAGMA_NOINLINE = 1 << 4, // Do not inline.
kono
parents:
diff changeset
63 GOPRAGMA_SYSTEMSTACK = 1 << 5, // Must run on system stack.
kono
parents:
diff changeset
64 GOPRAGMA_NOWRITEBARRIER = 1 << 6, // No write barriers.
kono
parents:
diff changeset
65 GOPRAGMA_NOWRITEBARRIERREC = 1 << 7, // No write barriers here or callees.
kono
parents:
diff changeset
66 GOPRAGMA_CGOUNSAFEARGS = 1 << 8, // Pointer to arg is pointer to all.
kono
parents:
diff changeset
67 GOPRAGMA_UINTPTRESCAPES = 1 << 9, // uintptr(p) escapes.
kono
parents:
diff changeset
68 GOPRAGMA_NOTINHEAP = 1 << 10 // type is not in heap.
kono
parents:
diff changeset
69 };
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 // A token returned from the lexer.
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 class Token
kono
parents:
diff changeset
74 {
kono
parents:
diff changeset
75 public:
kono
parents:
diff changeset
76 // Token classification.
kono
parents:
diff changeset
77 enum Classification
kono
parents:
diff changeset
78 {
kono
parents:
diff changeset
79 // Token is invalid.
kono
parents:
diff changeset
80 TOKEN_INVALID,
kono
parents:
diff changeset
81 // Token indicates end of input.
kono
parents:
diff changeset
82 TOKEN_EOF,
kono
parents:
diff changeset
83 // Token is a keyword.
kono
parents:
diff changeset
84 TOKEN_KEYWORD,
kono
parents:
diff changeset
85 // Token is an identifier.
kono
parents:
diff changeset
86 TOKEN_IDENTIFIER,
kono
parents:
diff changeset
87 // Token is a string of characters.
kono
parents:
diff changeset
88 TOKEN_STRING,
kono
parents:
diff changeset
89 // Token is an operator.
kono
parents:
diff changeset
90 TOKEN_OPERATOR,
kono
parents:
diff changeset
91 // Token is a character constant.
kono
parents:
diff changeset
92 TOKEN_CHARACTER,
kono
parents:
diff changeset
93 // Token is an integer.
kono
parents:
diff changeset
94 TOKEN_INTEGER,
kono
parents:
diff changeset
95 // Token is a floating point number.
kono
parents:
diff changeset
96 TOKEN_FLOAT,
kono
parents:
diff changeset
97 // Token is an imaginary number.
kono
parents:
diff changeset
98 TOKEN_IMAGINARY
kono
parents:
diff changeset
99 };
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 ~Token();
kono
parents:
diff changeset
102 Token(const Token&);
kono
parents:
diff changeset
103 Token& operator=(const Token&);
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 // Get token classification.
kono
parents:
diff changeset
106 Classification
kono
parents:
diff changeset
107 classification() const
kono
parents:
diff changeset
108 { return this->classification_; }
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 // Make a token for an invalid value.
kono
parents:
diff changeset
111 static Token
kono
parents:
diff changeset
112 make_invalid_token(Location location)
kono
parents:
diff changeset
113 { return Token(TOKEN_INVALID, location); }
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 // Make a token representing end of file.
kono
parents:
diff changeset
116 static Token
kono
parents:
diff changeset
117 make_eof_token(Location location)
kono
parents:
diff changeset
118 { return Token(TOKEN_EOF, location); }
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 // Make a keyword token.
kono
parents:
diff changeset
121 static Token
kono
parents:
diff changeset
122 make_keyword_token(Keyword keyword, Location location)
kono
parents:
diff changeset
123 {
kono
parents:
diff changeset
124 Token tok(TOKEN_KEYWORD, location);
kono
parents:
diff changeset
125 tok.u_.keyword = keyword;
kono
parents:
diff changeset
126 return tok;
kono
parents:
diff changeset
127 }
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 // Make an identifier token.
kono
parents:
diff changeset
130 static Token
kono
parents:
diff changeset
131 make_identifier_token(const std::string& value, bool is_exported,
kono
parents:
diff changeset
132 Location location)
kono
parents:
diff changeset
133 {
kono
parents:
diff changeset
134 Token tok(TOKEN_IDENTIFIER, location);
kono
parents:
diff changeset
135 tok.u_.identifier_value.name = new std::string(value);
kono
parents:
diff changeset
136 tok.u_.identifier_value.is_exported = is_exported;
kono
parents:
diff changeset
137 return tok;
kono
parents:
diff changeset
138 }
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 // Make a quoted string token.
kono
parents:
diff changeset
141 static Token
kono
parents:
diff changeset
142 make_string_token(const std::string& value, Location location)
kono
parents:
diff changeset
143 {
kono
parents:
diff changeset
144 Token tok(TOKEN_STRING, location);
kono
parents:
diff changeset
145 tok.u_.string_value = new std::string(value);
kono
parents:
diff changeset
146 return tok;
kono
parents:
diff changeset
147 }
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 // Make an operator token.
kono
parents:
diff changeset
150 static Token
kono
parents:
diff changeset
151 make_operator_token(Operator op, Location location)
kono
parents:
diff changeset
152 {
kono
parents:
diff changeset
153 Token tok(TOKEN_OPERATOR, location);
kono
parents:
diff changeset
154 tok.u_.op = op;
kono
parents:
diff changeset
155 return tok;
kono
parents:
diff changeset
156 }
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 // Make a character constant token.
kono
parents:
diff changeset
159 static Token
kono
parents:
diff changeset
160 make_character_token(mpz_t val, Location location)
kono
parents:
diff changeset
161 {
kono
parents:
diff changeset
162 Token tok(TOKEN_CHARACTER, location);
kono
parents:
diff changeset
163 mpz_init(tok.u_.integer_value);
kono
parents:
diff changeset
164 mpz_swap(tok.u_.integer_value, val);
kono
parents:
diff changeset
165 return tok;
kono
parents:
diff changeset
166 }
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 // Make an integer token.
kono
parents:
diff changeset
169 static Token
kono
parents:
diff changeset
170 make_integer_token(mpz_t val, Location location)
kono
parents:
diff changeset
171 {
kono
parents:
diff changeset
172 Token tok(TOKEN_INTEGER, location);
kono
parents:
diff changeset
173 mpz_init(tok.u_.integer_value);
kono
parents:
diff changeset
174 mpz_swap(tok.u_.integer_value, val);
kono
parents:
diff changeset
175 return tok;
kono
parents:
diff changeset
176 }
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 // Make a float token.
kono
parents:
diff changeset
179 static Token
kono
parents:
diff changeset
180 make_float_token(mpfr_t val, Location location)
kono
parents:
diff changeset
181 {
kono
parents:
diff changeset
182 Token tok(TOKEN_FLOAT, location);
kono
parents:
diff changeset
183 mpfr_init(tok.u_.float_value);
kono
parents:
diff changeset
184 mpfr_swap(tok.u_.float_value, val);
kono
parents:
diff changeset
185 return tok;
kono
parents:
diff changeset
186 }
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 // Make a token for an imaginary number.
kono
parents:
diff changeset
189 static Token
kono
parents:
diff changeset
190 make_imaginary_token(mpfr_t val, Location location)
kono
parents:
diff changeset
191 {
kono
parents:
diff changeset
192 Token tok(TOKEN_IMAGINARY, location);
kono
parents:
diff changeset
193 mpfr_init(tok.u_.float_value);
kono
parents:
diff changeset
194 mpfr_swap(tok.u_.float_value, val);
kono
parents:
diff changeset
195 return tok;
kono
parents:
diff changeset
196 }
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 // Get the location of the token.
kono
parents:
diff changeset
199 Location
kono
parents:
diff changeset
200 location() const
kono
parents:
diff changeset
201 { return this->location_; }
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 // Return whether this is an invalid token.
kono
parents:
diff changeset
204 bool
kono
parents:
diff changeset
205 is_invalid() const
kono
parents:
diff changeset
206 { return this->classification_ == TOKEN_INVALID; }
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 // Return whether this is the EOF token.
kono
parents:
diff changeset
209 bool
kono
parents:
diff changeset
210 is_eof() const
kono
parents:
diff changeset
211 { return this->classification_ == TOKEN_EOF; }
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 // Return the keyword value for a keyword token.
kono
parents:
diff changeset
214 Keyword
kono
parents:
diff changeset
215 keyword() const
kono
parents:
diff changeset
216 {
kono
parents:
diff changeset
217 go_assert(this->classification_ == TOKEN_KEYWORD);
kono
parents:
diff changeset
218 return this->u_.keyword;
kono
parents:
diff changeset
219 }
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 // Return whether this is an identifier.
kono
parents:
diff changeset
222 bool
kono
parents:
diff changeset
223 is_identifier() const
kono
parents:
diff changeset
224 { return this->classification_ == TOKEN_IDENTIFIER; }
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 // Return the identifier.
kono
parents:
diff changeset
227 const std::string&
kono
parents:
diff changeset
228 identifier() const
kono
parents:
diff changeset
229 {
kono
parents:
diff changeset
230 go_assert(this->classification_ == TOKEN_IDENTIFIER);
kono
parents:
diff changeset
231 return *this->u_.identifier_value.name;
kono
parents:
diff changeset
232 }
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 // Return whether the identifier is exported.
kono
parents:
diff changeset
235 bool
kono
parents:
diff changeset
236 is_identifier_exported() const
kono
parents:
diff changeset
237 {
kono
parents:
diff changeset
238 go_assert(this->classification_ == TOKEN_IDENTIFIER);
kono
parents:
diff changeset
239 return this->u_.identifier_value.is_exported;
kono
parents:
diff changeset
240 }
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 // Return whether this is a string.
kono
parents:
diff changeset
243 bool
kono
parents:
diff changeset
244 is_string() const
kono
parents:
diff changeset
245 {
kono
parents:
diff changeset
246 return this->classification_ == TOKEN_STRING;
kono
parents:
diff changeset
247 }
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 // Return the value of a string. The returned value is a string of
kono
parents:
diff changeset
250 // UTF-8 characters.
kono
parents:
diff changeset
251 std::string
kono
parents:
diff changeset
252 string_value() const
kono
parents:
diff changeset
253 {
kono
parents:
diff changeset
254 go_assert(this->classification_ == TOKEN_STRING);
kono
parents:
diff changeset
255 return *this->u_.string_value;
kono
parents:
diff changeset
256 }
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 // Return the value of a character constant.
kono
parents:
diff changeset
259 const mpz_t*
kono
parents:
diff changeset
260 character_value() const
kono
parents:
diff changeset
261 {
kono
parents:
diff changeset
262 go_assert(this->classification_ == TOKEN_CHARACTER);
kono
parents:
diff changeset
263 return &this->u_.integer_value;
kono
parents:
diff changeset
264 }
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 // Return the value of an integer.
kono
parents:
diff changeset
267 const mpz_t*
kono
parents:
diff changeset
268 integer_value() const
kono
parents:
diff changeset
269 {
kono
parents:
diff changeset
270 go_assert(this->classification_ == TOKEN_INTEGER);
kono
parents:
diff changeset
271 return &this->u_.integer_value;
kono
parents:
diff changeset
272 }
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 // Return the value of a float.
kono
parents:
diff changeset
275 const mpfr_t*
kono
parents:
diff changeset
276 float_value() const
kono
parents:
diff changeset
277 {
kono
parents:
diff changeset
278 go_assert(this->classification_ == TOKEN_FLOAT);
kono
parents:
diff changeset
279 return &this->u_.float_value;
kono
parents:
diff changeset
280 }
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 // Return the value of an imaginary number.
kono
parents:
diff changeset
283 const mpfr_t*
kono
parents:
diff changeset
284 imaginary_value() const
kono
parents:
diff changeset
285 {
kono
parents:
diff changeset
286 go_assert(this->classification_ == TOKEN_IMAGINARY);
kono
parents:
diff changeset
287 return &this->u_.float_value;
kono
parents:
diff changeset
288 }
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 // Return the operator value for an operator token.
kono
parents:
diff changeset
291 Operator
kono
parents:
diff changeset
292 op() const
kono
parents:
diff changeset
293 {
kono
parents:
diff changeset
294 go_assert(this->classification_ == TOKEN_OPERATOR);
kono
parents:
diff changeset
295 return this->u_.op;
kono
parents:
diff changeset
296 }
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 // Return whether this token is KEYWORD.
kono
parents:
diff changeset
299 bool
kono
parents:
diff changeset
300 is_keyword(Keyword keyword) const
kono
parents:
diff changeset
301 {
kono
parents:
diff changeset
302 return (this->classification_ == TOKEN_KEYWORD
kono
parents:
diff changeset
303 && this->u_.keyword == keyword);
kono
parents:
diff changeset
304 }
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 // Return whether this token is OP.
kono
parents:
diff changeset
307 bool
kono
parents:
diff changeset
308 is_op(Operator op) const
kono
parents:
diff changeset
309 { return this->classification_ == TOKEN_OPERATOR && this->u_.op == op; }
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 // Print the token for debugging.
kono
parents:
diff changeset
312 void
kono
parents:
diff changeset
313 print(FILE*) const;
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 private:
kono
parents:
diff changeset
316 // Private constructor used by make_..._token functions above.
kono
parents:
diff changeset
317 Token(Classification, Location);
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 // Clear the token.
kono
parents:
diff changeset
320 void
kono
parents:
diff changeset
321 clear();
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 // The token classification.
kono
parents:
diff changeset
324 Classification classification_;
kono
parents:
diff changeset
325 union
kono
parents:
diff changeset
326 {
kono
parents:
diff changeset
327 // The keyword value for TOKEN_KEYWORD.
kono
parents:
diff changeset
328 Keyword keyword;
kono
parents:
diff changeset
329 // The token value for TOKEN_IDENTIFIER.
kono
parents:
diff changeset
330 struct
kono
parents:
diff changeset
331 {
kono
parents:
diff changeset
332 // The name of the identifier. This has been mangled to only
kono
parents:
diff changeset
333 // include ASCII characters.
kono
parents:
diff changeset
334 std::string* name;
kono
parents:
diff changeset
335 // Whether this name should be exported. This is true if the
kono
parents:
diff changeset
336 // first letter in the name is upper case.
kono
parents:
diff changeset
337 bool is_exported;
kono
parents:
diff changeset
338 } identifier_value;
kono
parents:
diff changeset
339 // The string value for TOKEN_STRING.
kono
parents:
diff changeset
340 std::string* string_value;
kono
parents:
diff changeset
341 // The token value for TOKEN_CHARACTER or TOKEN_INTEGER.
kono
parents:
diff changeset
342 mpz_t integer_value;
kono
parents:
diff changeset
343 // The token value for TOKEN_FLOAT or TOKEN_IMAGINARY.
kono
parents:
diff changeset
344 mpfr_t float_value;
kono
parents:
diff changeset
345 // The token value for TOKEN_OPERATOR or the keyword value
kono
parents:
diff changeset
346 Operator op;
kono
parents:
diff changeset
347 } u_;
kono
parents:
diff changeset
348 // The source location.
kono
parents:
diff changeset
349 Location location_;
kono
parents:
diff changeset
350 };
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 // The lexer itself.
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 class Lex
kono
parents:
diff changeset
355 {
kono
parents:
diff changeset
356 public:
kono
parents:
diff changeset
357 Lex(const char* input_file_name, FILE* input_file, Linemap *linemap);
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 ~Lex();
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 // Return the next token.
kono
parents:
diff changeset
362 Token
kono
parents:
diff changeset
363 next_token();
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 // Return the contents of any current //extern comment.
kono
parents:
diff changeset
366 const std::string&
kono
parents:
diff changeset
367 extern_name() const
kono
parents:
diff changeset
368 { return this->extern_; }
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 // Return the current set of pragmas, and clear them.
kono
parents:
diff changeset
371 unsigned int
kono
parents:
diff changeset
372 get_and_clear_pragmas()
kono
parents:
diff changeset
373 {
kono
parents:
diff changeset
374 unsigned int ret = this->pragmas_;
kono
parents:
diff changeset
375 this->pragmas_ = 0;
kono
parents:
diff changeset
376 return ret;
kono
parents:
diff changeset
377 }
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 struct Linkname
kono
parents:
diff changeset
380 {
kono
parents:
diff changeset
381 std::string ext_name; // External name.
kono
parents:
diff changeset
382 bool is_exported; // Whether the internal name is exported.
kono
parents:
diff changeset
383 Location loc; // Location of go:linkname directive.
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 Linkname()
kono
parents:
diff changeset
386 : ext_name(), is_exported(false), loc()
kono
parents:
diff changeset
387 { }
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 Linkname(const std::string& ext_name_a, bool is_exported_a, Location loc_a)
kono
parents:
diff changeset
390 : ext_name(ext_name_a), is_exported(is_exported_a), loc(loc_a)
kono
parents:
diff changeset
391 { }
kono
parents:
diff changeset
392 };
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 typedef std::map<std::string, Linkname> Linknames;
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 // Return the linknames seen so far, or NULL if none, and clear the
kono
parents:
diff changeset
397 // set. These are from go:linkname compiler directives.
kono
parents:
diff changeset
398 Linknames*
kono
parents:
diff changeset
399 get_and_clear_linknames()
kono
parents:
diff changeset
400 {
kono
parents:
diff changeset
401 Linknames* ret = this->linknames_;
kono
parents:
diff changeset
402 this->linknames_ = NULL;
kono
parents:
diff changeset
403 return ret;
kono
parents:
diff changeset
404 }
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 // Return whether the identifier NAME should be exported. NAME is a
kono
parents:
diff changeset
407 // mangled name which includes only ASCII characters.
kono
parents:
diff changeset
408 static bool
kono
parents:
diff changeset
409 is_exported_name(const std::string& name);
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 // Return whether the identifier NAME is invalid. When we see an
kono
parents:
diff changeset
412 // invalid character we still build an identifier, but we use a
kono
parents:
diff changeset
413 // magic string to indicate that the identifier is invalid. We then
kono
parents:
diff changeset
414 // use this to avoid knockon errors.
kono
parents:
diff changeset
415 static bool
kono
parents:
diff changeset
416 is_invalid_identifier(const std::string& name);
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 // A helper function. Append V to STR. IS_CHARACTER is true if V
kono
parents:
diff changeset
419 // is a Unicode character which should be converted into UTF-8,
kono
parents:
diff changeset
420 // false if it is a byte value to be appended directly. The
kono
parents:
diff changeset
421 // location is used to warn about an out of range character.
kono
parents:
diff changeset
422 static void
kono
parents:
diff changeset
423 append_char(unsigned int v, bool is_charater, std::string* str,
kono
parents:
diff changeset
424 Location);
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 // A helper function. Fetch a UTF-8 character from STR and store it
kono
parents:
diff changeset
427 // in *VALUE. Return the number of bytes read from STR. Return 0
kono
parents:
diff changeset
428 // if STR does not point to a valid UTF-8 character.
kono
parents:
diff changeset
429 static int
kono
parents:
diff changeset
430 fetch_char(const char* str, unsigned int *value);
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 // Return whether C is a Unicode or "C" locale space character.
kono
parents:
diff changeset
433 static bool
kono
parents:
diff changeset
434 is_unicode_space(unsigned int c);
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 private:
kono
parents:
diff changeset
437 ssize_t
kono
parents:
diff changeset
438 get_line();
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 bool
kono
parents:
diff changeset
441 require_line();
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 // The current location.
kono
parents:
diff changeset
444 Location
kono
parents:
diff changeset
445 location() const;
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 // A position CHARS column positions before the current location.
kono
parents:
diff changeset
448 Location
kono
parents:
diff changeset
449 earlier_location(int chars) const;
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 static bool
kono
parents:
diff changeset
452 is_hex_digit(char);
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 static unsigned char
kono
parents:
diff changeset
455 octal_value(char c)
kono
parents:
diff changeset
456 { return c - '0'; }
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 static unsigned
kono
parents:
diff changeset
459 hex_val(char c);
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 Token
kono
parents:
diff changeset
462 make_invalid_token()
kono
parents:
diff changeset
463 { return Token::make_invalid_token(this->location()); }
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 Token
kono
parents:
diff changeset
466 make_eof_token()
kono
parents:
diff changeset
467 { return Token::make_eof_token(this->location()); }
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 Token
kono
parents:
diff changeset
470 make_operator(Operator op, int chars)
kono
parents:
diff changeset
471 { return Token::make_operator_token(op, this->earlier_location(chars)); }
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 Token
kono
parents:
diff changeset
474 gather_identifier();
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 static bool
kono
parents:
diff changeset
477 could_be_exponent(const char*, const char*);
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 Token
kono
parents:
diff changeset
480 gather_number();
kono
parents:
diff changeset
481
kono
parents:
diff changeset
482 Token
kono
parents:
diff changeset
483 gather_character();
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 Token
kono
parents:
diff changeset
486 gather_string();
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 Token
kono
parents:
diff changeset
489 gather_raw_string();
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 const char*
kono
parents:
diff changeset
492 advance_one_utf8_char(const char*, unsigned int*, bool*);
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 const char*
kono
parents:
diff changeset
495 advance_one_char(const char*, bool, unsigned int*, bool*);
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 static bool
kono
parents:
diff changeset
498 is_unicode_digit(unsigned int c);
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 static bool
kono
parents:
diff changeset
501 is_unicode_letter(unsigned int c);
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 static bool
kono
parents:
diff changeset
504 is_unicode_uppercase(unsigned int c);
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 static bool
kono
parents:
diff changeset
507 is_in_unicode_range(unsigned int C, const Unicode_range* ranges,
kono
parents:
diff changeset
508 size_t range_size);
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 Operator
kono
parents:
diff changeset
511 three_character_operator(char, char, char);
kono
parents:
diff changeset
512
kono
parents:
diff changeset
513 Operator
kono
parents:
diff changeset
514 two_character_operator(char, char);
kono
parents:
diff changeset
515
kono
parents:
diff changeset
516 Operator
kono
parents:
diff changeset
517 one_character_operator(char);
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 bool
kono
parents:
diff changeset
520 skip_c_comment(bool* found_newline);
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 void
kono
parents:
diff changeset
523 skip_cpp_comment();
kono
parents:
diff changeset
524
kono
parents:
diff changeset
525 // The input file name.
kono
parents:
diff changeset
526 const char* input_file_name_;
kono
parents:
diff changeset
527 // The input file.
kono
parents:
diff changeset
528 FILE* input_file_;
kono
parents:
diff changeset
529 // The object used to keep track of file names and line numbers.
kono
parents:
diff changeset
530 Linemap* linemap_;
kono
parents:
diff changeset
531 // The line buffer. This holds the current line.
kono
parents:
diff changeset
532 char* linebuf_;
kono
parents:
diff changeset
533 // The size of the line buffer.
kono
parents:
diff changeset
534 size_t linebufsize_;
kono
parents:
diff changeset
535 // The nmber of characters in the current line.
kono
parents:
diff changeset
536 size_t linesize_;
kono
parents:
diff changeset
537 // The current offset in linebuf_.
kono
parents:
diff changeset
538 size_t lineoff_;
kono
parents:
diff changeset
539 // The current line number.
kono
parents:
diff changeset
540 size_t lineno_;
kono
parents:
diff changeset
541 // Whether to add a semicolon if we see a newline now.
kono
parents:
diff changeset
542 bool add_semi_at_eol_;
kono
parents:
diff changeset
543 // Pragmas for the next function, from magic comments.
kono
parents:
diff changeset
544 unsigned int pragmas_;
kono
parents:
diff changeset
545 // The external name to use for a function declaration, from a magic
kono
parents:
diff changeset
546 // //extern comment.
kono
parents:
diff changeset
547 std::string extern_;
kono
parents:
diff changeset
548 // The list of //go:linkname comments, if any.
kono
parents:
diff changeset
549 Linknames* linknames_;
kono
parents:
diff changeset
550 };
kono
parents:
diff changeset
551
kono
parents:
diff changeset
552 #endif // !defined(GO_LEX_H)