OSDN Git Service

compiler: Correct parse of for with possible composite literal.
[pf3gnuchains/gcc-fork.git] / gcc / go / gofrontend / parse.h
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 Set_iota_traverse;
11 class Lex;
12 class Gogo;
13 class Named_object;
14 class Type;
15 class Typed_identifier;
16 class Typed_identifier_list;
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     Range_clause()
65       : 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   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     Type_switch()
83       : found(false), name(), location(UNKNOWN_LOCATION), expr(NULL)
84     { }
85   };
86
87   // A variable defined in an enclosing function referenced by the
88   // current function.
89   class Enclosing_var
90   {
91    public:
92     Enclosing_var(Named_object* var, Named_object* in_function,
93                   unsigned int index)
94       : var_(var), in_function_(in_function), index_(index)
95     { }
96
97     // We put these in a vector, so we need a default constructor.
98     Enclosing_var()
99       : var_(NULL), in_function_(NULL), index_(-1U)
100     { }
101
102     Named_object*
103     var() const
104     { return this->var_; }
105
106     Named_object*
107     in_function() const
108     { return this->in_function_; }
109
110     unsigned int
111     index() const
112     { return this->index_; }
113
114    private:
115     // The variable which is being referred to.
116     Named_object* var_;
117     // The function where the variable is defined.
118     Named_object* in_function_;
119     // The index of the field in this function's closure struct for
120     // this variable.
121     unsigned int index_;
122   };
123
124   // We store Enclosing_var entries in a set, so we need a comparator.
125   struct Enclosing_var_comparison
126   {
127     bool
128     operator()(const Enclosing_var&, const Enclosing_var&);
129   };
130
131   // A set of Enclosing_var entries.
132   typedef std::set<Enclosing_var, Enclosing_var_comparison> Enclosing_vars;
133
134   // Used to detect duplicate parameter/result names.
135   typedef std::map<std::string, const Typed_identifier*> Names;
136
137   // Peek at the current token from the lexer.
138   const Token*
139   peek_token();
140
141   // Consume the current token, return the next one.
142   const Token*
143   advance_token();
144
145   // Push a token back on the input stream.
146   void
147   unget_token(const Token&);
148
149   // The location of the current token.
150   Location
151   location();
152
153   // For break and continue we keep a stack of statements with
154   // associated labels (if any).  The top of the stack is used for a
155   // break or continue statement with no label.
156   typedef std::vector<std::pair<Statement*, Label*> > Bc_stack;
157
158   // Map from type switch variables to the variables they mask, so
159   // that a use of the type switch variable can become a use of the
160   // real variable.
161   typedef Unordered_map(Named_object*, Named_object*) Type_switch_vars;
162
163   // Parser nonterminals.
164   void identifier_list(Typed_identifier_list*);
165   Expression_list* expression_list(Expression*, bool may_be_sink,
166                                    bool may_be_composite_lit);
167   bool qualified_ident(std::string*, Named_object**);
168   Type* type();
169   bool type_may_start_here();
170   Type* type_name(bool issue_error);
171   Type* array_type(bool may_use_ellipsis);
172   Type* map_type();
173   Type* struct_type();
174   void field_decl(Struct_field_list*);
175   Type* pointer_type();
176   Type* channel_type();
177   void check_signature_names(const Typed_identifier_list*, Names*);
178   Function_type* signature(Typed_identifier*, Location);
179   bool parameters(Typed_identifier_list**, bool* is_varargs);
180   Typed_identifier_list* parameter_list(bool* is_varargs);
181   void parameter_decl(bool, Typed_identifier_list*, bool*, bool*);
182   bool result(Typed_identifier_list**);
183   Location block();
184   Type* interface_type();
185   void method_spec(Typed_identifier_list*);
186   void declaration();
187   bool declaration_may_start_here();
188   void decl(void (Parse::*)(void*), void*);
189   void list(void (Parse::*)(void*), void*, bool);
190   void const_decl();
191   void const_spec(Type**, Expression_list**);
192   void type_decl();
193   void type_spec(void*);
194   void var_decl();
195   void var_spec(void*);
196   void init_vars(const Typed_identifier_list*, Type*, Expression_list*,
197                  bool is_coloneq, Location);
198   bool init_vars_from_call(const Typed_identifier_list*, Type*, Expression*,
199                            bool is_coloneq, Location);
200   bool init_vars_from_map(const Typed_identifier_list*, Type*, Expression*,
201                           bool is_coloneq, Location);
202   bool init_vars_from_receive(const Typed_identifier_list*, Type*,
203                               Expression*, bool is_coloneq, Location);
204   bool init_vars_from_type_guard(const Typed_identifier_list*, Type*,
205                                  Expression*, bool is_coloneq,
206                                  Location);
207   Named_object* init_var(const Typed_identifier&, Type*, Expression*,
208                          bool is_coloneq, bool type_from_init, bool* is_new);
209   Named_object* create_dummy_global(Type*, Expression*, 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);
216   Expression* enclosing_var_reference(Named_object*, Named_object*,
217                                       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);
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 expression_may_start_here();
230   Expression* unary_expr(bool may_be_sink, bool may_be_composite_lit,
231                          bool* is_type_switch);
232   Expression* qualified_expr(Expression*, Location);
233   Expression* id_to_expression(const std::string&, Location);
234   void statement(Label*);
235   bool statement_may_start_here();
236   void labeled_stmt(const std::string&, Location);
237   Expression* simple_stat(bool, bool*, Range_clause*, Type_switch*);
238   bool simple_stat_may_start_here();
239   void statement_list();
240   bool statement_list_may_start_here();
241   void expression_stat(Expression*);
242   void send_stmt(Expression*);
243   void inc_dec_stat(Expression*);
244   void assignment(Expression*, bool may_be_composite_lit, Range_clause*);
245   void tuple_assignment(Expression_list*, bool may_be_composite_lit,
246                         Range_clause*);
247   void send();
248   void go_or_defer_stat();
249   void return_stat();
250   void if_stat();
251   void switch_stat(Label*);
252   Statement* expr_switch_body(Label*, Expression*, Location);
253   void expr_case_clause(Case_clauses*, bool* saw_default);
254   Expression_list* expr_switch_case(bool*);
255   Statement* type_switch_body(Label*, const Type_switch&, Location);
256   void type_case_clause(Named_object*, Type_case_clauses*, bool* saw_default);
257   void type_switch_case(std::vector<Type*>*, bool*);
258   void select_stat(Label*);
259   void comm_clause(Select_clauses*, bool* saw_default);
260   bool comm_case(bool*, Expression**, Expression**, Expression**,
261                  std::string*, std::string*, bool*);
262   bool send_or_recv_stmt(bool*, Expression**, Expression**, Expression**,
263                          std::string*, std::string*);
264   void for_stat(Label*);
265   void for_clause(Expression**, Block**);
266   void range_clause_decl(const Typed_identifier_list*, Range_clause*);
267   void range_clause_expr(const Expression_list*, Range_clause*);
268   void push_break_statement(Statement*, Label*);
269   void push_continue_statement(Statement*, Label*);
270   void pop_break_statement();
271   void pop_continue_statement();
272   Statement* find_bc_statement(const Bc_stack*, const std::string&);
273   void break_stat();
274   void continue_stat();
275   void goto_stat();
276   void package_clause();
277   void import_decl();
278   void import_spec(void*);
279
280   void reset_iota();
281   int iota_value();
282   void increment_iota();
283
284   // Skip past an error looking for a semicolon or OP.  Return true if
285   // all is well, false if we found EOF.
286   bool
287   skip_past_error(Operator op);
288
289   // Verify that an expression is not a sink, and return either the
290   // expression or an error.
291   Expression*
292   verify_not_sink(Expression*);
293
294   // Return the statement associated with a label in a Bc_stack, or
295   // NULL.
296   Statement*
297   find_bc_statement(const Bc_stack*, const std::string&) const;
298
299   // Mark a variable as used.
300   void
301   mark_var_used(Named_object*);
302
303   // The lexer output we are parsing.
304   Lex* lex_;
305   // The current token.
306   Token token_;
307   // A token pushed back on the input stream.
308   Token unget_token_;
309   // Whether unget_token_ is valid.
310   bool unget_token_valid_;
311   // Whether the function we are parsing had errors in the signature.
312   bool is_erroneous_function_;
313   // The code we are generating.
314   Gogo* gogo_;
315   // A stack of statements for which break may be used.
316   Bc_stack* break_stack_;
317   // A stack of statements for which continue may be used.
318   Bc_stack* continue_stack_;
319   // The current iota value.
320   int iota_;
321   // References from the local function to variables defined in
322   // enclosing functions.
323   Enclosing_vars enclosing_vars_;
324   // Map from type switch variables to real variables.
325   Type_switch_vars type_switch_vars_;
326 };
327
328
329 #endif // !defined(GO_PARSE_H)