annotate gcc/go/gofrontend/parse.h @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // parse.h -- Go frontend parser. -*- 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_PARSE_H
kono
parents:
diff changeset
8 #define GO_PARSE_H
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 class Lex;
kono
parents:
diff changeset
11 class Gogo;
kono
parents:
diff changeset
12 class Named_object;
kono
parents:
diff changeset
13 class Type;
kono
parents:
diff changeset
14 class Typed_identifier;
kono
parents:
diff changeset
15 class Typed_identifier_list;
kono
parents:
diff changeset
16 class Channel_type;
kono
parents:
diff changeset
17 class Function_type;
kono
parents:
diff changeset
18 class Block;
kono
parents:
diff changeset
19 class Expression;
kono
parents:
diff changeset
20 class Expression_list;
kono
parents:
diff changeset
21 class Struct_field_list;
kono
parents:
diff changeset
22 class Case_clauses;
kono
parents:
diff changeset
23 class Type_case_clauses;
kono
parents:
diff changeset
24 class Select_clauses;
kono
parents:
diff changeset
25 class Statement;
kono
parents:
diff changeset
26 class Label;
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 // Parse the program.
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 class Parse
kono
parents:
diff changeset
31 {
kono
parents:
diff changeset
32 public:
kono
parents:
diff changeset
33 Parse(Lex*, Gogo*);
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 // Parse a program.
kono
parents:
diff changeset
36 void
kono
parents:
diff changeset
37 program();
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 private:
kono
parents:
diff changeset
40 // Precedence values.
kono
parents:
diff changeset
41 enum Precedence
kono
parents:
diff changeset
42 {
kono
parents:
diff changeset
43 PRECEDENCE_INVALID = -1,
kono
parents:
diff changeset
44 PRECEDENCE_NORMAL = 0,
kono
parents:
diff changeset
45 PRECEDENCE_OROR,
kono
parents:
diff changeset
46 PRECEDENCE_ANDAND,
kono
parents:
diff changeset
47 PRECEDENCE_RELOP,
kono
parents:
diff changeset
48 PRECEDENCE_ADDOP,
kono
parents:
diff changeset
49 PRECEDENCE_MULOP
kono
parents:
diff changeset
50 };
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 // We use this when parsing the range clause of a for statement.
kono
parents:
diff changeset
53 struct Range_clause
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 // Set to true if we found a range clause.
kono
parents:
diff changeset
56 bool found;
kono
parents:
diff changeset
57 // The index expression.
kono
parents:
diff changeset
58 Expression* index;
kono
parents:
diff changeset
59 // The value expression.
kono
parents:
diff changeset
60 Expression* value;
kono
parents:
diff changeset
61 // The range expression.
kono
parents:
diff changeset
62 Expression* range;
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 Range_clause()
kono
parents:
diff changeset
65 : found(false), index(NULL), value(NULL), range(NULL)
kono
parents:
diff changeset
66 { }
kono
parents:
diff changeset
67 };
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 // We use this when parsing the statement at the start of a switch,
kono
parents:
diff changeset
70 // in order to recognize type switches.
kono
parents:
diff changeset
71 struct Type_switch
kono
parents:
diff changeset
72 {
kono
parents:
diff changeset
73 // Set to true if we find a type switch.
kono
parents:
diff changeset
74 bool found;
kono
parents:
diff changeset
75 // The variable name.
kono
parents:
diff changeset
76 std::string name;
kono
parents:
diff changeset
77 // The location of the variable.
kono
parents:
diff changeset
78 Location location;
kono
parents:
diff changeset
79 // The expression.
kono
parents:
diff changeset
80 Expression* expr;
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 Type_switch()
kono
parents:
diff changeset
83 : found(false), name(), location(Linemap::unknown_location()),
kono
parents:
diff changeset
84 expr(NULL)
kono
parents:
diff changeset
85 { }
kono
parents:
diff changeset
86 };
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 // A variable defined in an enclosing function referenced by the
kono
parents:
diff changeset
89 // current function.
kono
parents:
diff changeset
90 class Enclosing_var
kono
parents:
diff changeset
91 {
kono
parents:
diff changeset
92 public:
kono
parents:
diff changeset
93 Enclosing_var(Named_object* var, Named_object* in_function,
kono
parents:
diff changeset
94 unsigned int index)
kono
parents:
diff changeset
95 : var_(var), in_function_(in_function), index_(index)
kono
parents:
diff changeset
96 { }
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 // We put these in a vector, so we need a default constructor.
kono
parents:
diff changeset
99 Enclosing_var()
kono
parents:
diff changeset
100 : var_(NULL), in_function_(NULL), index_(-1U)
kono
parents:
diff changeset
101 { }
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 Named_object*
kono
parents:
diff changeset
104 var() const
kono
parents:
diff changeset
105 { return this->var_; }
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 Named_object*
kono
parents:
diff changeset
108 in_function() const
kono
parents:
diff changeset
109 { return this->in_function_; }
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 unsigned int
kono
parents:
diff changeset
112 index() const
kono
parents:
diff changeset
113 { return this->index_; }
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 private:
kono
parents:
diff changeset
116 // The variable which is being referred to.
kono
parents:
diff changeset
117 Named_object* var_;
kono
parents:
diff changeset
118 // The function where the variable is defined.
kono
parents:
diff changeset
119 Named_object* in_function_;
kono
parents:
diff changeset
120 // The index of the field in this function's closure struct for
kono
parents:
diff changeset
121 // this variable.
kono
parents:
diff changeset
122 unsigned int index_;
kono
parents:
diff changeset
123 };
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 // We store Enclosing_var entries in a set, so we need a comparator.
kono
parents:
diff changeset
126 struct Enclosing_var_comparison
kono
parents:
diff changeset
127 {
kono
parents:
diff changeset
128 bool
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129 operator()(const Enclosing_var&, const Enclosing_var&) const;
111
kono
parents:
diff changeset
130 };
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 // A set of Enclosing_var entries.
kono
parents:
diff changeset
133 typedef std::set<Enclosing_var, Enclosing_var_comparison> Enclosing_vars;
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 // Used to detect duplicate parameter/result names.
kono
parents:
diff changeset
136 typedef std::map<std::string, const Typed_identifier*> Names;
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 // Peek at the current token from the lexer.
kono
parents:
diff changeset
139 const Token*
kono
parents:
diff changeset
140 peek_token();
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 // Consume the current token, return the next one.
kono
parents:
diff changeset
143 const Token*
kono
parents:
diff changeset
144 advance_token();
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 // Push a token back on the input stream.
kono
parents:
diff changeset
147 void
kono
parents:
diff changeset
148 unget_token(const Token&);
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 // The location of the current token.
kono
parents:
diff changeset
151 Location
kono
parents:
diff changeset
152 location();
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 // For break and continue we keep a stack of statements with
kono
parents:
diff changeset
155 // associated labels (if any). The top of the stack is used for a
kono
parents:
diff changeset
156 // break or continue statement with no label.
kono
parents:
diff changeset
157 typedef std::vector<std::pair<Statement*, Label*> > Bc_stack;
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 // Parser nonterminals.
kono
parents:
diff changeset
160 void identifier_list(Typed_identifier_list*);
kono
parents:
diff changeset
161 Expression_list* expression_list(Expression*, bool may_be_sink,
kono
parents:
diff changeset
162 bool may_be_composite_lit);
kono
parents:
diff changeset
163 bool qualified_ident(std::string*, Named_object**);
kono
parents:
diff changeset
164 Type* type();
kono
parents:
diff changeset
165 bool type_may_start_here();
kono
parents:
diff changeset
166 Type* type_name(bool issue_error);
kono
parents:
diff changeset
167 Type* array_type(bool may_use_ellipsis);
kono
parents:
diff changeset
168 Type* map_type();
kono
parents:
diff changeset
169 Type* struct_type();
kono
parents:
diff changeset
170 void field_decl(Struct_field_list*);
kono
parents:
diff changeset
171 Type* pointer_type();
kono
parents:
diff changeset
172 Type* channel_type();
kono
parents:
diff changeset
173 void check_signature_names(const Typed_identifier_list*, Names*);
kono
parents:
diff changeset
174 Function_type* signature(Typed_identifier*, Location);
kono
parents:
diff changeset
175 bool parameters(Typed_identifier_list**, bool* is_varargs);
kono
parents:
diff changeset
176 Typed_identifier_list* parameter_list(bool* is_varargs);
kono
parents:
diff changeset
177 void parameter_decl(bool, Typed_identifier_list*, bool*, bool*, bool*);
kono
parents:
diff changeset
178 bool result(Typed_identifier_list**);
kono
parents:
diff changeset
179 Location block();
kono
parents:
diff changeset
180 Type* interface_type(bool record);
kono
parents:
diff changeset
181 void method_spec(Typed_identifier_list*);
kono
parents:
diff changeset
182 void declaration();
kono
parents:
diff changeset
183 bool declaration_may_start_here();
kono
parents:
diff changeset
184 void decl(void (Parse::*)(void*, unsigned int), void*, unsigned int pragmas);
kono
parents:
diff changeset
185 void list(void (Parse::*)(void*, unsigned int), void*, bool);
kono
parents:
diff changeset
186 void const_decl();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
187 void const_spec(int, Type**, Expression_list**);
111
kono
parents:
diff changeset
188 void type_decl(unsigned int pragmas);
kono
parents:
diff changeset
189 void type_spec(void*, unsigned int pragmas);
kono
parents:
diff changeset
190 void var_decl();
kono
parents:
diff changeset
191 void var_spec(void*, unsigned int pragmas);
kono
parents:
diff changeset
192 void init_vars(const Typed_identifier_list*, Type*, Expression_list*,
kono
parents:
diff changeset
193 bool is_coloneq, Location);
kono
parents:
diff changeset
194 bool init_vars_from_call(const Typed_identifier_list*, Type*, Expression*,
kono
parents:
diff changeset
195 bool is_coloneq, Location);
kono
parents:
diff changeset
196 bool init_vars_from_map(const Typed_identifier_list*, Type*, Expression*,
kono
parents:
diff changeset
197 bool is_coloneq, Location);
kono
parents:
diff changeset
198 bool init_vars_from_receive(const Typed_identifier_list*, Type*,
kono
parents:
diff changeset
199 Expression*, bool is_coloneq, Location);
kono
parents:
diff changeset
200 bool init_vars_from_type_guard(const Typed_identifier_list*, Type*,
kono
parents:
diff changeset
201 Expression*, bool is_coloneq,
kono
parents:
diff changeset
202 Location);
kono
parents:
diff changeset
203 Named_object* init_var(const Typed_identifier&, Type*, Expression*,
kono
parents:
diff changeset
204 bool is_coloneq, bool type_from_init, bool* is_new,
kono
parents:
diff changeset
205 Expression_list* vars, Expression_list* vals);
kono
parents:
diff changeset
206 Named_object* create_dummy_global(Type*, Expression*, Location);
kono
parents:
diff changeset
207 void finish_init_vars(Expression_list* vars, Expression_list* vals,
kono
parents:
diff changeset
208 Location);
kono
parents:
diff changeset
209 void simple_var_decl_or_assignment(const std::string&, Location,
kono
parents:
diff changeset
210 bool may_be_composite_lit,
kono
parents:
diff changeset
211 Range_clause*, Type_switch*);
kono
parents:
diff changeset
212 void function_decl(unsigned int pragmas);
kono
parents:
diff changeset
213 Typed_identifier* receiver();
kono
parents:
diff changeset
214 Expression* operand(bool may_be_sink, bool *is_parenthesized);
kono
parents:
diff changeset
215 Expression* enclosing_var_reference(Named_object*, Named_object*,
kono
parents:
diff changeset
216 bool may_be_sink, Location);
kono
parents:
diff changeset
217 Expression* composite_lit(Type*, int depth, Location);
kono
parents:
diff changeset
218 Expression* function_lit();
kono
parents:
diff changeset
219 Expression* create_closure(Named_object* function, Enclosing_vars*,
kono
parents:
diff changeset
220 Location);
kono
parents:
diff changeset
221 Expression* primary_expr(bool may_be_sink, bool may_be_composite_lit,
kono
parents:
diff changeset
222 bool* is_type_switch, bool* is_parenthesized);
kono
parents:
diff changeset
223 Expression* selector(Expression*, bool* is_type_switch);
kono
parents:
diff changeset
224 Expression* index(Expression*);
kono
parents:
diff changeset
225 Expression* call(Expression*);
kono
parents:
diff changeset
226 Expression* expression(Precedence, bool may_be_sink,
kono
parents:
diff changeset
227 bool may_be_composite_lit, bool* is_type_switch,
kono
parents:
diff changeset
228 bool *is_parenthesized);
kono
parents:
diff changeset
229 bool expression_may_start_here();
kono
parents:
diff changeset
230 Expression* unary_expr(bool may_be_sink, bool may_be_composite_lit,
kono
parents:
diff changeset
231 bool* is_type_switch, bool* is_parenthesized);
kono
parents:
diff changeset
232 Type* reassociate_chan_direction(Channel_type*, Location);
kono
parents:
diff changeset
233 Expression* qualified_expr(Expression*, Location);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
234 Expression* id_to_expression(const std::string&, Location, bool, bool);
111
kono
parents:
diff changeset
235 void statement(Label*);
kono
parents:
diff changeset
236 bool statement_may_start_here();
kono
parents:
diff changeset
237 void labeled_stmt(const std::string&, Location);
kono
parents:
diff changeset
238 Expression* simple_stat(bool, bool*, Range_clause*, Type_switch*);
kono
parents:
diff changeset
239 bool simple_stat_may_start_here();
kono
parents:
diff changeset
240 void statement_list();
kono
parents:
diff changeset
241 bool statement_list_may_start_here();
kono
parents:
diff changeset
242 void expression_stat(Expression*);
kono
parents:
diff changeset
243 void send_stmt(Expression*, bool may_be_composite_lit);
kono
parents:
diff changeset
244 void inc_dec_stat(Expression*);
kono
parents:
diff changeset
245 void assignment(Expression*, bool may_be_composite_lit, Range_clause*);
kono
parents:
diff changeset
246 void tuple_assignment(Expression_list*, bool may_be_composite_lit,
kono
parents:
diff changeset
247 Range_clause*);
kono
parents:
diff changeset
248 void send();
kono
parents:
diff changeset
249 void go_or_defer_stat();
kono
parents:
diff changeset
250 void return_stat();
kono
parents:
diff changeset
251 void if_stat();
kono
parents:
diff changeset
252 void switch_stat(Label*);
kono
parents:
diff changeset
253 Statement* expr_switch_body(Label*, Expression*, Location);
kono
parents:
diff changeset
254 void expr_case_clause(Case_clauses*, bool* saw_default);
kono
parents:
diff changeset
255 Expression_list* expr_switch_case(bool*);
kono
parents:
diff changeset
256 Statement* type_switch_body(Label*, const Type_switch&, Location);
kono
parents:
diff changeset
257 void type_case_clause(const std::string&, Expression*, Type_case_clauses*,
kono
parents:
diff changeset
258 bool* saw_default, std::vector<Named_object*>*);
kono
parents:
diff changeset
259 void type_switch_case(std::vector<Type*>*, bool*);
kono
parents:
diff changeset
260 void select_stat(Label*);
kono
parents:
diff changeset
261 void comm_clause(Select_clauses*, bool* saw_default);
kono
parents:
diff changeset
262 bool comm_case(bool*, Expression**, Expression**, Expression**,
kono
parents:
diff changeset
263 std::string*, std::string*, bool*);
kono
parents:
diff changeset
264 bool send_or_recv_stmt(bool*, Expression**, Expression**, Expression**,
kono
parents:
diff changeset
265 std::string*, std::string*);
kono
parents:
diff changeset
266 void for_stat(Label*);
kono
parents:
diff changeset
267 void for_clause(Expression**, Block**);
kono
parents:
diff changeset
268 void range_clause_decl(const Typed_identifier_list*, Range_clause*);
kono
parents:
diff changeset
269 void range_clause_expr(const Expression_list*, Range_clause*);
kono
parents:
diff changeset
270 void push_break_statement(Statement*, Label*);
kono
parents:
diff changeset
271 void push_continue_statement(Statement*, Label*);
kono
parents:
diff changeset
272 void pop_break_statement();
kono
parents:
diff changeset
273 void pop_continue_statement();
kono
parents:
diff changeset
274 Statement* find_bc_statement(const Bc_stack*, const std::string&);
kono
parents:
diff changeset
275 void break_stat();
kono
parents:
diff changeset
276 void continue_stat();
kono
parents:
diff changeset
277 void goto_stat();
kono
parents:
diff changeset
278 void package_clause();
kono
parents:
diff changeset
279 void import_decl();
kono
parents:
diff changeset
280 void import_spec(void*, unsigned int pragmas);
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 // Skip past an error looking for a semicolon or OP. Return true if
kono
parents:
diff changeset
283 // all is well, false if we found EOF.
kono
parents:
diff changeset
284 bool
kono
parents:
diff changeset
285 skip_past_error(Operator op);
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 // Verify that an expression is not a sink, and return either the
kono
parents:
diff changeset
288 // expression or an error.
kono
parents:
diff changeset
289 Expression*
kono
parents:
diff changeset
290 verify_not_sink(Expression*);
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 // Return the statement associated with a label in a Bc_stack, or
kono
parents:
diff changeset
293 // NULL.
kono
parents:
diff changeset
294 Statement*
kono
parents:
diff changeset
295 find_bc_statement(const Bc_stack*, const std::string&) const;
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 // Mark a variable as used.
kono
parents:
diff changeset
298 void
kono
parents:
diff changeset
299 mark_var_used(Named_object*);
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 // The lexer output we are parsing.
kono
parents:
diff changeset
302 Lex* lex_;
kono
parents:
diff changeset
303 // The current token.
kono
parents:
diff changeset
304 Token token_;
kono
parents:
diff changeset
305 // A token pushed back on the input stream.
kono
parents:
diff changeset
306 Token unget_token_;
kono
parents:
diff changeset
307 // Whether unget_token_ is valid.
kono
parents:
diff changeset
308 bool unget_token_valid_;
kono
parents:
diff changeset
309 // Whether the function we are parsing had errors in the signature.
kono
parents:
diff changeset
310 bool is_erroneous_function_;
kono
parents:
diff changeset
311 // The code we are generating.
kono
parents:
diff changeset
312 Gogo* gogo_;
kono
parents:
diff changeset
313 // A stack of statements for which break may be used.
kono
parents:
diff changeset
314 Bc_stack* break_stack_;
kono
parents:
diff changeset
315 // A stack of statements for which continue may be used.
kono
parents:
diff changeset
316 Bc_stack* continue_stack_;
kono
parents:
diff changeset
317 // References from the local function to variables defined in
kono
parents:
diff changeset
318 // enclosing functions.
kono
parents:
diff changeset
319 Enclosing_vars enclosing_vars_;
kono
parents:
diff changeset
320 };
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 #endif // !defined(GO_PARSE_H)