annotate gcc/go/gofrontend/lex.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
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.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
66 GOPRAGMA_YESWRITEBARRIERREC = 1 << 8, // Stops nowritebarrierrec.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
67 GOPRAGMA_MARK = 1 << 9, // Marker for nowritebarrierrec.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
68 GOPRAGMA_CGOUNSAFEARGS = 1 << 10, // Pointer to arg is pointer to all.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
69 GOPRAGMA_UINTPTRESCAPES = 1 << 11, // uintptr(p) escapes.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
70 GOPRAGMA_NOTINHEAP = 1 << 12 // type is not in heap.
111
kono
parents:
diff changeset
71 };
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 // A token returned from the lexer.
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 class Token
kono
parents:
diff changeset
76 {
kono
parents:
diff changeset
77 public:
kono
parents:
diff changeset
78 // Token classification.
kono
parents:
diff changeset
79 enum Classification
kono
parents:
diff changeset
80 {
kono
parents:
diff changeset
81 // Token is invalid.
kono
parents:
diff changeset
82 TOKEN_INVALID,
kono
parents:
diff changeset
83 // Token indicates end of input.
kono
parents:
diff changeset
84 TOKEN_EOF,
kono
parents:
diff changeset
85 // Token is a keyword.
kono
parents:
diff changeset
86 TOKEN_KEYWORD,
kono
parents:
diff changeset
87 // Token is an identifier.
kono
parents:
diff changeset
88 TOKEN_IDENTIFIER,
kono
parents:
diff changeset
89 // Token is a string of characters.
kono
parents:
diff changeset
90 TOKEN_STRING,
kono
parents:
diff changeset
91 // Token is an operator.
kono
parents:
diff changeset
92 TOKEN_OPERATOR,
kono
parents:
diff changeset
93 // Token is a character constant.
kono
parents:
diff changeset
94 TOKEN_CHARACTER,
kono
parents:
diff changeset
95 // Token is an integer.
kono
parents:
diff changeset
96 TOKEN_INTEGER,
kono
parents:
diff changeset
97 // Token is a floating point number.
kono
parents:
diff changeset
98 TOKEN_FLOAT,
kono
parents:
diff changeset
99 // Token is an imaginary number.
kono
parents:
diff changeset
100 TOKEN_IMAGINARY
kono
parents:
diff changeset
101 };
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 ~Token();
kono
parents:
diff changeset
104 Token(const Token&);
kono
parents:
diff changeset
105 Token& operator=(const Token&);
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 // Get token classification.
kono
parents:
diff changeset
108 Classification
kono
parents:
diff changeset
109 classification() const
kono
parents:
diff changeset
110 { return this->classification_; }
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 // Make a token for an invalid value.
kono
parents:
diff changeset
113 static Token
kono
parents:
diff changeset
114 make_invalid_token(Location location)
kono
parents:
diff changeset
115 { return Token(TOKEN_INVALID, location); }
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 // Make a token representing end of file.
kono
parents:
diff changeset
118 static Token
kono
parents:
diff changeset
119 make_eof_token(Location location)
kono
parents:
diff changeset
120 { return Token(TOKEN_EOF, location); }
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 // Make a keyword token.
kono
parents:
diff changeset
123 static Token
kono
parents:
diff changeset
124 make_keyword_token(Keyword keyword, Location location)
kono
parents:
diff changeset
125 {
kono
parents:
diff changeset
126 Token tok(TOKEN_KEYWORD, location);
kono
parents:
diff changeset
127 tok.u_.keyword = keyword;
kono
parents:
diff changeset
128 return tok;
kono
parents:
diff changeset
129 }
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 // Make an identifier token.
kono
parents:
diff changeset
132 static Token
kono
parents:
diff changeset
133 make_identifier_token(const std::string& value, bool is_exported,
kono
parents:
diff changeset
134 Location location)
kono
parents:
diff changeset
135 {
kono
parents:
diff changeset
136 Token tok(TOKEN_IDENTIFIER, location);
kono
parents:
diff changeset
137 tok.u_.identifier_value.name = new std::string(value);
kono
parents:
diff changeset
138 tok.u_.identifier_value.is_exported = is_exported;
kono
parents:
diff changeset
139 return tok;
kono
parents:
diff changeset
140 }
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 // Make a quoted string token.
kono
parents:
diff changeset
143 static Token
kono
parents:
diff changeset
144 make_string_token(const std::string& value, Location location)
kono
parents:
diff changeset
145 {
kono
parents:
diff changeset
146 Token tok(TOKEN_STRING, location);
kono
parents:
diff changeset
147 tok.u_.string_value = new std::string(value);
kono
parents:
diff changeset
148 return tok;
kono
parents:
diff changeset
149 }
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 // Make an operator token.
kono
parents:
diff changeset
152 static Token
kono
parents:
diff changeset
153 make_operator_token(Operator op, Location location)
kono
parents:
diff changeset
154 {
kono
parents:
diff changeset
155 Token tok(TOKEN_OPERATOR, location);
kono
parents:
diff changeset
156 tok.u_.op = op;
kono
parents:
diff changeset
157 return tok;
kono
parents:
diff changeset
158 }
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 // Make a character constant token.
kono
parents:
diff changeset
161 static Token
kono
parents:
diff changeset
162 make_character_token(mpz_t val, Location location)
kono
parents:
diff changeset
163 {
kono
parents:
diff changeset
164 Token tok(TOKEN_CHARACTER, location);
kono
parents:
diff changeset
165 mpz_init(tok.u_.integer_value);
kono
parents:
diff changeset
166 mpz_swap(tok.u_.integer_value, val);
kono
parents:
diff changeset
167 return tok;
kono
parents:
diff changeset
168 }
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 // Make an integer token.
kono
parents:
diff changeset
171 static Token
kono
parents:
diff changeset
172 make_integer_token(mpz_t val, Location location)
kono
parents:
diff changeset
173 {
kono
parents:
diff changeset
174 Token tok(TOKEN_INTEGER, location);
kono
parents:
diff changeset
175 mpz_init(tok.u_.integer_value);
kono
parents:
diff changeset
176 mpz_swap(tok.u_.integer_value, val);
kono
parents:
diff changeset
177 return tok;
kono
parents:
diff changeset
178 }
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 // Make a float token.
kono
parents:
diff changeset
181 static Token
kono
parents:
diff changeset
182 make_float_token(mpfr_t val, Location location)
kono
parents:
diff changeset
183 {
kono
parents:
diff changeset
184 Token tok(TOKEN_FLOAT, location);
kono
parents:
diff changeset
185 mpfr_init(tok.u_.float_value);
kono
parents:
diff changeset
186 mpfr_swap(tok.u_.float_value, val);
kono
parents:
diff changeset
187 return tok;
kono
parents:
diff changeset
188 }
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 // Make a token for an imaginary number.
kono
parents:
diff changeset
191 static Token
kono
parents:
diff changeset
192 make_imaginary_token(mpfr_t val, Location location)
kono
parents:
diff changeset
193 {
kono
parents:
diff changeset
194 Token tok(TOKEN_IMAGINARY, location);
kono
parents:
diff changeset
195 mpfr_init(tok.u_.float_value);
kono
parents:
diff changeset
196 mpfr_swap(tok.u_.float_value, val);
kono
parents:
diff changeset
197 return tok;
kono
parents:
diff changeset
198 }
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 // Get the location of the token.
kono
parents:
diff changeset
201 Location
kono
parents:
diff changeset
202 location() const
kono
parents:
diff changeset
203 { return this->location_; }
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 // Return whether this is an invalid token.
kono
parents:
diff changeset
206 bool
kono
parents:
diff changeset
207 is_invalid() const
kono
parents:
diff changeset
208 { return this->classification_ == TOKEN_INVALID; }
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 // Return whether this is the EOF token.
kono
parents:
diff changeset
211 bool
kono
parents:
diff changeset
212 is_eof() const
kono
parents:
diff changeset
213 { return this->classification_ == TOKEN_EOF; }
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 // Return the keyword value for a keyword token.
kono
parents:
diff changeset
216 Keyword
kono
parents:
diff changeset
217 keyword() const
kono
parents:
diff changeset
218 {
kono
parents:
diff changeset
219 go_assert(this->classification_ == TOKEN_KEYWORD);
kono
parents:
diff changeset
220 return this->u_.keyword;
kono
parents:
diff changeset
221 }
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 // Return whether this is an identifier.
kono
parents:
diff changeset
224 bool
kono
parents:
diff changeset
225 is_identifier() const
kono
parents:
diff changeset
226 { return this->classification_ == TOKEN_IDENTIFIER; }
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 // Return the identifier.
kono
parents:
diff changeset
229 const std::string&
kono
parents:
diff changeset
230 identifier() const
kono
parents:
diff changeset
231 {
kono
parents:
diff changeset
232 go_assert(this->classification_ == TOKEN_IDENTIFIER);
kono
parents:
diff changeset
233 return *this->u_.identifier_value.name;
kono
parents:
diff changeset
234 }
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 // Return whether the identifier is exported.
kono
parents:
diff changeset
237 bool
kono
parents:
diff changeset
238 is_identifier_exported() const
kono
parents:
diff changeset
239 {
kono
parents:
diff changeset
240 go_assert(this->classification_ == TOKEN_IDENTIFIER);
kono
parents:
diff changeset
241 return this->u_.identifier_value.is_exported;
kono
parents:
diff changeset
242 }
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 // Return whether this is a string.
kono
parents:
diff changeset
245 bool
kono
parents:
diff changeset
246 is_string() const
kono
parents:
diff changeset
247 {
kono
parents:
diff changeset
248 return this->classification_ == TOKEN_STRING;
kono
parents:
diff changeset
249 }
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 // Return the value of a string. The returned value is a string of
kono
parents:
diff changeset
252 // UTF-8 characters.
kono
parents:
diff changeset
253 std::string
kono
parents:
diff changeset
254 string_value() const
kono
parents:
diff changeset
255 {
kono
parents:
diff changeset
256 go_assert(this->classification_ == TOKEN_STRING);
kono
parents:
diff changeset
257 return *this->u_.string_value;
kono
parents:
diff changeset
258 }
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 // Return the value of a character constant.
kono
parents:
diff changeset
261 const mpz_t*
kono
parents:
diff changeset
262 character_value() const
kono
parents:
diff changeset
263 {
kono
parents:
diff changeset
264 go_assert(this->classification_ == TOKEN_CHARACTER);
kono
parents:
diff changeset
265 return &this->u_.integer_value;
kono
parents:
diff changeset
266 }
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 // Return the value of an integer.
kono
parents:
diff changeset
269 const mpz_t*
kono
parents:
diff changeset
270 integer_value() const
kono
parents:
diff changeset
271 {
kono
parents:
diff changeset
272 go_assert(this->classification_ == TOKEN_INTEGER);
kono
parents:
diff changeset
273 return &this->u_.integer_value;
kono
parents:
diff changeset
274 }
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 // Return the value of a float.
kono
parents:
diff changeset
277 const mpfr_t*
kono
parents:
diff changeset
278 float_value() const
kono
parents:
diff changeset
279 {
kono
parents:
diff changeset
280 go_assert(this->classification_ == TOKEN_FLOAT);
kono
parents:
diff changeset
281 return &this->u_.float_value;
kono
parents:
diff changeset
282 }
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 // Return the value of an imaginary number.
kono
parents:
diff changeset
285 const mpfr_t*
kono
parents:
diff changeset
286 imaginary_value() const
kono
parents:
diff changeset
287 {
kono
parents:
diff changeset
288 go_assert(this->classification_ == TOKEN_IMAGINARY);
kono
parents:
diff changeset
289 return &this->u_.float_value;
kono
parents:
diff changeset
290 }
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 // Return the operator value for an operator token.
kono
parents:
diff changeset
293 Operator
kono
parents:
diff changeset
294 op() const
kono
parents:
diff changeset
295 {
kono
parents:
diff changeset
296 go_assert(this->classification_ == TOKEN_OPERATOR);
kono
parents:
diff changeset
297 return this->u_.op;
kono
parents:
diff changeset
298 }
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 // Return whether this token is KEYWORD.
kono
parents:
diff changeset
301 bool
kono
parents:
diff changeset
302 is_keyword(Keyword keyword) const
kono
parents:
diff changeset
303 {
kono
parents:
diff changeset
304 return (this->classification_ == TOKEN_KEYWORD
kono
parents:
diff changeset
305 && this->u_.keyword == keyword);
kono
parents:
diff changeset
306 }
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 // Return whether this token is OP.
kono
parents:
diff changeset
309 bool
kono
parents:
diff changeset
310 is_op(Operator op) const
kono
parents:
diff changeset
311 { return this->classification_ == TOKEN_OPERATOR && this->u_.op == op; }
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 // Print the token for debugging.
kono
parents:
diff changeset
314 void
kono
parents:
diff changeset
315 print(FILE*) const;
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 private:
kono
parents:
diff changeset
318 // Private constructor used by make_..._token functions above.
kono
parents:
diff changeset
319 Token(Classification, Location);
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 // Clear the token.
kono
parents:
diff changeset
322 void
kono
parents:
diff changeset
323 clear();
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 // The token classification.
kono
parents:
diff changeset
326 Classification classification_;
kono
parents:
diff changeset
327 union
kono
parents:
diff changeset
328 {
kono
parents:
diff changeset
329 // The keyword value for TOKEN_KEYWORD.
kono
parents:
diff changeset
330 Keyword keyword;
kono
parents:
diff changeset
331 // The token value for TOKEN_IDENTIFIER.
kono
parents:
diff changeset
332 struct
kono
parents:
diff changeset
333 {
kono
parents:
diff changeset
334 // The name of the identifier. This has been mangled to only
kono
parents:
diff changeset
335 // include ASCII characters.
kono
parents:
diff changeset
336 std::string* name;
kono
parents:
diff changeset
337 // Whether this name should be exported. This is true if the
kono
parents:
diff changeset
338 // first letter in the name is upper case.
kono
parents:
diff changeset
339 bool is_exported;
kono
parents:
diff changeset
340 } identifier_value;
kono
parents:
diff changeset
341 // The string value for TOKEN_STRING.
kono
parents:
diff changeset
342 std::string* string_value;
kono
parents:
diff changeset
343 // The token value for TOKEN_CHARACTER or TOKEN_INTEGER.
kono
parents:
diff changeset
344 mpz_t integer_value;
kono
parents:
diff changeset
345 // The token value for TOKEN_FLOAT or TOKEN_IMAGINARY.
kono
parents:
diff changeset
346 mpfr_t float_value;
kono
parents:
diff changeset
347 // The token value for TOKEN_OPERATOR or the keyword value
kono
parents:
diff changeset
348 Operator op;
kono
parents:
diff changeset
349 } u_;
kono
parents:
diff changeset
350 // The source location.
kono
parents:
diff changeset
351 Location location_;
kono
parents:
diff changeset
352 };
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 // The lexer itself.
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 class Lex
kono
parents:
diff changeset
357 {
kono
parents:
diff changeset
358 public:
kono
parents:
diff changeset
359 Lex(const char* input_file_name, FILE* input_file, Linemap *linemap);
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 ~Lex();
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 // Return the next token.
kono
parents:
diff changeset
364 Token
kono
parents:
diff changeset
365 next_token();
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 // Return the contents of any current //extern comment.
kono
parents:
diff changeset
368 const std::string&
kono
parents:
diff changeset
369 extern_name() const
kono
parents:
diff changeset
370 { return this->extern_; }
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 // Return the current set of pragmas, and clear them.
kono
parents:
diff changeset
373 unsigned int
kono
parents:
diff changeset
374 get_and_clear_pragmas()
kono
parents:
diff changeset
375 {
kono
parents:
diff changeset
376 unsigned int ret = this->pragmas_;
kono
parents:
diff changeset
377 this->pragmas_ = 0;
kono
parents:
diff changeset
378 return ret;
kono
parents:
diff changeset
379 }
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 struct Linkname
kono
parents:
diff changeset
382 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
383 std::string ext_name; // External name; empty to just export.
111
kono
parents:
diff changeset
384 bool is_exported; // Whether the internal name is exported.
kono
parents:
diff changeset
385 Location loc; // Location of go:linkname directive.
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 Linkname()
kono
parents:
diff changeset
388 : ext_name(), is_exported(false), loc()
kono
parents:
diff changeset
389 { }
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 Linkname(const std::string& ext_name_a, bool is_exported_a, Location loc_a)
kono
parents:
diff changeset
392 : ext_name(ext_name_a), is_exported(is_exported_a), loc(loc_a)
kono
parents:
diff changeset
393 { }
kono
parents:
diff changeset
394 };
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 typedef std::map<std::string, Linkname> Linknames;
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 // Return the linknames seen so far, or NULL if none, and clear the
kono
parents:
diff changeset
399 // set. These are from go:linkname compiler directives.
kono
parents:
diff changeset
400 Linknames*
kono
parents:
diff changeset
401 get_and_clear_linknames()
kono
parents:
diff changeset
402 {
kono
parents:
diff changeset
403 Linknames* ret = this->linknames_;
kono
parents:
diff changeset
404 this->linknames_ = NULL;
kono
parents:
diff changeset
405 return ret;
kono
parents:
diff changeset
406 }
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 // Return whether the identifier NAME should be exported. NAME is a
kono
parents:
diff changeset
409 // mangled name which includes only ASCII characters.
kono
parents:
diff changeset
410 static bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
411 is_exported_mangled_name(const std::string& name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
412
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
413 // Return whether the identifier NAME should be exported. NAME is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
414 // an unmangled utf-8 string and may contain non-ASCII characters.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
415 static bool
111
kono
parents:
diff changeset
416 is_exported_name(const std::string& name);
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 // Return whether the identifier NAME is invalid. When we see an
kono
parents:
diff changeset
419 // invalid character we still build an identifier, but we use a
kono
parents:
diff changeset
420 // magic string to indicate that the identifier is invalid. We then
kono
parents:
diff changeset
421 // use this to avoid knockon errors.
kono
parents:
diff changeset
422 static bool
kono
parents:
diff changeset
423 is_invalid_identifier(const std::string& name);
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 // A helper function. Append V to STR. IS_CHARACTER is true if V
kono
parents:
diff changeset
426 // is a Unicode character which should be converted into UTF-8,
kono
parents:
diff changeset
427 // false if it is a byte value to be appended directly. The
kono
parents:
diff changeset
428 // location is used to warn about an out of range character.
kono
parents:
diff changeset
429 static void
kono
parents:
diff changeset
430 append_char(unsigned int v, bool is_charater, std::string* str,
kono
parents:
diff changeset
431 Location);
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 // A helper function. Fetch a UTF-8 character from STR and store it
kono
parents:
diff changeset
434 // in *VALUE. Return the number of bytes read from STR. Return 0
kono
parents:
diff changeset
435 // if STR does not point to a valid UTF-8 character.
kono
parents:
diff changeset
436 static int
kono
parents:
diff changeset
437 fetch_char(const char* str, unsigned int *value);
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 // Return whether C is a Unicode or "C" locale space character.
kono
parents:
diff changeset
440 static bool
kono
parents:
diff changeset
441 is_unicode_space(unsigned int c);
kono
parents:
diff changeset
442
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
443 // Convert the specified hex char into an unsigned integer value.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
444 static unsigned
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
445 hex_val(char c);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
446
111
kono
parents:
diff changeset
447 private:
kono
parents:
diff changeset
448 ssize_t
kono
parents:
diff changeset
449 get_line();
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 bool
kono
parents:
diff changeset
452 require_line();
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 // The current location.
kono
parents:
diff changeset
455 Location
kono
parents:
diff changeset
456 location() const;
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 // A position CHARS column positions before the current location.
kono
parents:
diff changeset
459 Location
kono
parents:
diff changeset
460 earlier_location(int chars) const;
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 static bool
kono
parents:
diff changeset
463 is_hex_digit(char);
kono
parents:
diff changeset
464
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
465 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
466 is_base_digit(int base, char);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
467
111
kono
parents:
diff changeset
468 static unsigned char
kono
parents:
diff changeset
469 octal_value(char c)
kono
parents:
diff changeset
470 { return c - '0'; }
kono
parents:
diff changeset
471
kono
parents:
diff changeset
472 Token
kono
parents:
diff changeset
473 make_invalid_token()
kono
parents:
diff changeset
474 { return Token::make_invalid_token(this->location()); }
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 Token
kono
parents:
diff changeset
477 make_eof_token()
kono
parents:
diff changeset
478 { return Token::make_eof_token(this->location()); }
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 Token
kono
parents:
diff changeset
481 make_operator(Operator op, int chars)
kono
parents:
diff changeset
482 { return Token::make_operator_token(op, this->earlier_location(chars)); }
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 Token
kono
parents:
diff changeset
485 gather_identifier();
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 static bool
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
488 could_be_exponent(int base, const char*, const char*);
111
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 Token
kono
parents:
diff changeset
491 gather_number();
kono
parents:
diff changeset
492
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
493 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
494 skip_exponent();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
495
111
kono
parents:
diff changeset
496 Token
kono
parents:
diff changeset
497 gather_character();
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 Token
kono
parents:
diff changeset
500 gather_string();
kono
parents:
diff changeset
501
kono
parents:
diff changeset
502 Token
kono
parents:
diff changeset
503 gather_raw_string();
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 const char*
kono
parents:
diff changeset
506 advance_one_utf8_char(const char*, unsigned int*, bool*);
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 const char*
kono
parents:
diff changeset
509 advance_one_char(const char*, bool, unsigned int*, bool*);
kono
parents:
diff changeset
510
kono
parents:
diff changeset
511 static bool
kono
parents:
diff changeset
512 is_unicode_digit(unsigned int c);
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 static bool
kono
parents:
diff changeset
515 is_unicode_letter(unsigned int c);
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 static bool
kono
parents:
diff changeset
518 is_unicode_uppercase(unsigned int c);
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 static bool
kono
parents:
diff changeset
521 is_in_unicode_range(unsigned int C, const Unicode_range* ranges,
kono
parents:
diff changeset
522 size_t range_size);
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 Operator
kono
parents:
diff changeset
525 three_character_operator(char, char, char);
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 Operator
kono
parents:
diff changeset
528 two_character_operator(char, char);
kono
parents:
diff changeset
529
kono
parents:
diff changeset
530 Operator
kono
parents:
diff changeset
531 one_character_operator(char);
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 bool
kono
parents:
diff changeset
534 skip_c_comment(bool* found_newline);
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 void
kono
parents:
diff changeset
537 skip_cpp_comment();
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 // The input file name.
kono
parents:
diff changeset
540 const char* input_file_name_;
kono
parents:
diff changeset
541 // The input file.
kono
parents:
diff changeset
542 FILE* input_file_;
kono
parents:
diff changeset
543 // The object used to keep track of file names and line numbers.
kono
parents:
diff changeset
544 Linemap* linemap_;
kono
parents:
diff changeset
545 // The line buffer. This holds the current line.
kono
parents:
diff changeset
546 char* linebuf_;
kono
parents:
diff changeset
547 // The size of the line buffer.
kono
parents:
diff changeset
548 size_t linebufsize_;
kono
parents:
diff changeset
549 // The nmber of characters in the current line.
kono
parents:
diff changeset
550 size_t linesize_;
kono
parents:
diff changeset
551 // The current offset in linebuf_.
kono
parents:
diff changeset
552 size_t lineoff_;
kono
parents:
diff changeset
553 // The current line number.
kono
parents:
diff changeset
554 size_t lineno_;
kono
parents:
diff changeset
555 // Whether to add a semicolon if we see a newline now.
kono
parents:
diff changeset
556 bool add_semi_at_eol_;
kono
parents:
diff changeset
557 // Pragmas for the next function, from magic comments.
kono
parents:
diff changeset
558 unsigned int pragmas_;
kono
parents:
diff changeset
559 // The external name to use for a function declaration, from a magic
kono
parents:
diff changeset
560 // //extern comment.
kono
parents:
diff changeset
561 std::string extern_;
kono
parents:
diff changeset
562 // The list of //go:linkname comments, if any.
kono
parents:
diff changeset
563 Linknames* linknames_;
kono
parents:
diff changeset
564 };
kono
parents:
diff changeset
565
kono
parents:
diff changeset
566 #endif // !defined(GO_LEX_H)