(root)/
gcc-13.2.0/
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 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      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(Linemap::unknown_location()),
      84            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      Enclosing_var(Named_object* var, Named_object* in_function,
      94  		  unsigned int index)
      95        : var_(var), in_function_(in_function), index_(index)
      96      { }
      97  
      98      // We put these in a vector, so we need a default constructor.
      99      Enclosing_var()
     100        : var_(NULL), in_function_(NULL), index_(-1U)
     101      { }
     102  
     103      Named_object*
     104      var() const
     105      { return this->var_; }
     106  
     107      Named_object*
     108      in_function() const
     109      { return this->in_function_; }
     110  
     111      unsigned int
     112      index() const
     113      { 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)