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