/* This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ #ifndef RUST_PARSE_H #define RUST_PARSE_H #include "rust-lex.h" #include "rust-ast-full.h" #include "rust-diagnostics.h" namespace Rust { /* HACK: used to resolve the expression-or-statement problem at the end of a * block by allowing either to be returned (technically). Tagged union would * probably take up the same amount of space. */ struct ExprOrStmt { std::unique_ptr expr; std::unique_ptr stmt; /* I was going to resist the urge to make this a real class and make it POD, * but construction in steps is too difficult. So it'll just also have a * constructor. */ // expression constructor ExprOrStmt (std::unique_ptr expr) : expr (std::move (expr)) {} // statement constructor ExprOrStmt (std::unique_ptr stmt) : stmt (std::move (stmt)) {} // macro constructor ExprOrStmt (std::unique_ptr macro) : expr (std::move (macro)) {} // Returns whether this object is in an error state. bool is_error () const { return (expr == nullptr && stmt == nullptr) || (expr != nullptr && stmt != nullptr); } // Returns an error state object. static ExprOrStmt create_error () { return ExprOrStmt (nullptr, nullptr); } ~ExprOrStmt () = default; /* no copy constructors/assignment as simple object like this shouldn't * require it */ // move constructors ExprOrStmt (ExprOrStmt &&other) = default; ExprOrStmt &operator= (ExprOrStmt &&other) = default; private: // private constructor only used for creating error state expr or stmt objects ExprOrStmt (AST::Expr *expr, AST::Stmt *stmt) : expr (expr), stmt (stmt) {} // make this work: have a disambiguation specifically for known statements // (i.e. ';' and 'let'). then, have a special "parse expr or stmt" function // that returns this type. inside it, it parses an expression, and then // determines whether to return expr or stmt via whether the next token is a // semicolon. should be able to disambiguate inside that function between // stmts with blocks and without blocks. }; /* Restrictions on parsing used to signal that certain ambiguous grammar * features should be parsed in a certain way. */ struct ParseRestrictions { bool can_be_struct_expr = true; /* Whether the expression was entered from a unary expression - prevents stuff * like struct exprs being parsed from a dereference. */ bool entered_from_unary = false; bool expr_can_be_null = false; bool expr_can_be_stmt = false; bool consume_semi = true; }; // Parser implementation for gccrs. // TODO: if updated to C++20, ManagedTokenSource would be useful as a concept template class Parser { public: /** * Consume a token, reporting an error if it isn't the next token * * @param t ID of the token to consume * * @return true if the token was next, false if it wasn't found */ bool skip_token (TokenId t); /** * Same as `skip_token` but allows for failure without necessarily reporting * an error * * @param t ID of the token to consume * * @return true if the token was next, false if it wasn't found */ bool maybe_skip_token (TokenId t); std::unique_ptr parse_expr (AST::AttrVec outer_attrs = AST::AttrVec (), ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_literal_expr (AST::AttrVec outer_attrs = AST::AttrVec ()); std::unique_ptr parse_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_item (bool called_from_statement); std::unique_ptr parse_pattern (); /** * Parse a statement * * Statement : ';' * | Item * | LetStatement * | ExpressionStatement * | MacroInvocationSemi */ std::unique_ptr parse_stmt (ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_type (bool save_errors = true); std::unique_ptr parse_external_item (); std::unique_ptr parse_trait_item (); std::unique_ptr parse_inherent_impl_item (); std::unique_ptr parse_trait_impl_item (); AST::PathInExpression parse_path_in_expression (); std::vector > parse_lifetime_params (); AST::Visibility parse_visibility (); std::unique_ptr parse_identifier_pattern (); std::unique_ptr parse_token_tree (); AST::Attribute parse_attribute_body (); AST::AttrVec parse_inner_attributes (); std::unique_ptr parse_macro_invocation (AST::AttrVec outer_attrs); private: void skip_after_semicolon (); void skip_after_end (); void skip_after_end_block (); void skip_after_next_block (); void skip_after_end_attribute (); const_TokenPtr expect_token (TokenId t); void unexpected_token (const_TokenPtr t); bool skip_generics_right_angle (); void parse_statement_seq (bool (Parser::*done) ()); // AST-related stuff - maybe move or something? AST::Attribute parse_inner_attribute (); AST::AttrVec parse_outer_attributes (); AST::Attribute parse_outer_attribute (); std::unique_ptr parse_attr_input (); AST::Attribute parse_doc_comment (); // Path-related AST::SimplePath parse_simple_path (); AST::SimplePathSegment parse_simple_path_segment (); AST::TypePath parse_type_path (); std::unique_ptr parse_type_path_segment (); AST::PathIdentSegment parse_path_ident_segment (); AST::GenericArg parse_generic_arg (); AST::GenericArgs parse_path_generic_args (); AST::GenericArgsBinding parse_generic_args_binding (); AST::TypePathFunction parse_type_path_function (Location locus); AST::PathExprSegment parse_path_expr_segment (); AST::QualifiedPathInExpression // When given a pratt_parsed_loc, use it as the location of the // first token parsed in the expression (the parsing of that first // token should be skipped). parse_qualified_path_in_expression (Location pratt_parsed_loc = Linemap::unknown_location ()); AST::QualifiedPathType parse_qualified_path_type (Location pratt_parsed_loc = Linemap::unknown_location ()); AST::QualifiedPathInType parse_qualified_path_in_type (); // Token tree or macro related AST::DelimTokenTree parse_delim_token_tree (); std::unique_ptr parse_macro_rules_def (AST::AttrVec outer_attrs); std::unique_ptr parse_decl_macro_def (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_macro_invocation_semi (AST::AttrVec outer_attrs); AST::MacroRule parse_macro_rule (); AST::MacroMatcher parse_macro_matcher (); std::unique_ptr parse_macro_match (); std::unique_ptr parse_macro_match_fragment (); std::unique_ptr parse_macro_match_repetition (); // Top-level item-related std::unique_ptr parse_vis_item (AST::AttrVec outer_attrs); // VisItem subclass-related std::unique_ptr parse_module (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_extern_crate (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_use_decl (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_use_tree (); std::unique_ptr parse_function (AST::Visibility vis, AST::AttrVec outer_attrs); AST::FunctionQualifiers parse_function_qualifiers (); std::vector > parse_generic_params_in_angles (); template std::vector > parse_generic_params (EndTokenPred is_end_token); template std::unique_ptr parse_generic_param (EndTokenPred is_end_token); template std::vector > parse_lifetime_params (EndTokenPred is_end_token); std::vector parse_lifetime_params_objs (); template std::vector parse_lifetime_params_objs (EndTokenPred is_end_token); template auto parse_non_ptr_sequence ( ParseFunction parsing_function, EndTokenPred is_end_token, std::string error_msg = "failed to parse generic param in generic params") -> std::vector; AST::LifetimeParam parse_lifetime_param (); std::vector > parse_type_params (); template std::vector > parse_type_params (EndTokenPred is_end_token); std::unique_ptr parse_type_param (); template std::vector parse_function_params (EndTokenPred is_end_token); AST::FunctionParam parse_function_param (); std::unique_ptr parse_function_return_type (); AST::WhereClause parse_where_clause (); std::unique_ptr parse_where_clause_item (); std::unique_ptr parse_lifetime_where_clause_item (); std::unique_ptr parse_type_bound_where_clause_item (); std::vector parse_for_lifetimes (); template std::vector > parse_type_param_bounds (EndTokenPred is_end_token); std::vector > parse_type_param_bounds (); std::unique_ptr parse_type_param_bound (); std::unique_ptr parse_trait_bound (); std::vector parse_lifetime_bounds (); template std::vector parse_lifetime_bounds (EndTokenPred is_end_token); AST::Lifetime parse_lifetime (); std::unique_ptr parse_type_alias (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_struct (AST::Visibility vis, AST::AttrVec outer_attrs); std::vector parse_struct_fields (); template std::vector parse_struct_fields (EndTokenPred is_end_token); AST::StructField parse_struct_field (); std::vector parse_tuple_fields (); AST::TupleField parse_tuple_field (); std::unique_ptr parse_enum (AST::Visibility vis, AST::AttrVec outer_attrs); std::vector > parse_enum_items (); template std::vector > parse_enum_items (EndTokenPred is_end_token); std::unique_ptr parse_enum_item (); std::unique_ptr parse_union (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_const_item (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_static_item (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_trait (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_trait_type (AST::AttrVec outer_attrs); std::unique_ptr parse_trait_const (AST::AttrVec outer_attrs); AST::SelfParam parse_self_param (); std::unique_ptr parse_impl (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_inherent_impl_function_or_method (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_trait_impl_function_or_method (AST::Visibility vis, AST::AttrVec outer_attrs); std::unique_ptr parse_extern_block (AST::Visibility vis, AST::AttrVec outer_attrs); AST::NamedFunctionParam parse_named_function_param (AST::AttrVec outer_attrs = AST::AttrVec ()); AST::Method parse_method (); // Expression-related (Pratt parsed) std::unique_ptr parse_expr (int right_binding_power, AST::AttrVec outer_attrs = AST::AttrVec (), ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr null_denotation (const_TokenPtr t, AST::AttrVec outer_attrs = AST::AttrVec (), ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr left_denotation (const_TokenPtr t, std::unique_ptr left, AST::AttrVec outer_attrs = AST::AttrVec (), ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_arithmetic_or_logical_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, AST::ArithmeticOrLogicalExpr::ExprType expr_type, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_plus_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_minus_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_mult_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_div_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_mod_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_bitwise_and_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_bitwise_or_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_bitwise_xor_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_left_shift_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_right_shift_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_comparison_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, AST::ComparisonExpr::ExprType expr_type, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_equal_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_not_equal_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_greater_than_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_less_than_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_greater_equal_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_binary_less_equal_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_lazy_or_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_lazy_and_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_type_cast_expr (const_TokenPtr tok, std::unique_ptr expr_to_cast, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_assig_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_compound_assignment_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, AST::CompoundAssignmentExpr::ExprType expr_type, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_plus_assig_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_minus_assig_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_mult_assig_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_div_assig_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_mod_assig_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_and_assig_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_or_assig_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_xor_assig_expr (const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_left_shift_assig_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_right_shift_assig_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_await_expr (const_TokenPtr tok, std::unique_ptr expr_to_await, AST::AttrVec outer_attrs); std::unique_ptr parse_method_call_expr ( const_TokenPtr tok, std::unique_ptr receiver_expr, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_function_call_expr ( const_TokenPtr tok, std::unique_ptr function_expr, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_led_range_exclusive_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_nud_range_exclusive_expr (const_TokenPtr tok, AST::AttrVec outer_attrs); std::unique_ptr parse_range_inclusive_expr ( const_TokenPtr tok, std::unique_ptr left, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_range_to_inclusive_expr (const_TokenPtr tok, AST::AttrVec outer_attrs); std::unique_ptr parse_tuple_index_expr ( const_TokenPtr tok, std::unique_ptr tuple_expr, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_field_access_expr ( const_TokenPtr tok, std::unique_ptr struct_expr, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_index_expr (const_TokenPtr tok, std::unique_ptr array_expr, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_macro_invocation_partial ( AST::PathInExpression path, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_struct_expr_struct_partial (AST::PathInExpression path, AST::AttrVec outer_attrs); std::unique_ptr parse_struct_expr_tuple_partial (AST::PathInExpression path, AST::AttrVec outer_attrs); AST::PathInExpression parse_path_in_expression_pratt (const_TokenPtr tok); std::unique_ptr parse_closure_expr_pratt (const_TokenPtr tok, AST::AttrVec outer_attrs = AST::AttrVec ()); std::unique_ptr parse_tuple_index_expr_float ( const_TokenPtr tok, std::unique_ptr tuple_expr, AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); // Expression-related (non-Pratt parsed) std::unique_ptr parse_expr_with_block (AST::AttrVec outer_attrs); std::unique_ptr parse_expr_without_block (AST::AttrVec outer_attrs = AST::AttrVec (), ParseRestrictions restrictions = ParseRestrictions ()); // When given a pratt_parsed_loc, use it as the location of the // first token parsed in the expression (the parsing of that first // token should be skipped). std::unique_ptr parse_if_expr (AST::AttrVec outer_attrs = AST::AttrVec (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_if_let_expr (AST::AttrVec outer_attrs = AST::AttrVec (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (), AST::LoopLabel label = AST::LoopLabel::error (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_while_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (), AST::LoopLabel label = AST::LoopLabel::error (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_while_let_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (), AST::LoopLabel label = AST::LoopLabel::error ()); std::unique_ptr parse_for_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (), AST::LoopLabel label = AST::LoopLabel::error ()); std::unique_ptr parse_match_expr (AST::AttrVec outer_attrs = AST::AttrVec (), Location pratt_parsed_loc = Linemap::unknown_location ()); AST::MatchArm parse_match_arm (); std::vector > parse_match_arm_patterns (TokenId end_token_id); std::unique_ptr parse_labelled_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec ()); AST::LoopLabel parse_loop_label (); std::unique_ptr parse_async_block_expr (AST::AttrVec outer_attrs = AST::AttrVec ()); std::unique_ptr parse_grouped_expr (AST::AttrVec outer_attrs = AST::AttrVec ()); std::unique_ptr parse_closure_expr (AST::AttrVec outer_attrs = AST::AttrVec ()); AST::ClosureParam parse_closure_param (); // When given a pratt_parsed_loc, use it as the location of the // first token parsed in the expression (the parsing of that first // token should be skipped). std::unique_ptr parse_return_expr (AST::AttrVec outer_attrs = AST::AttrVec (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_break_expr (AST::AttrVec outer_attrs = AST::AttrVec (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_continue_expr (AST::AttrVec outer_attrs = AST::AttrVec (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_unsafe_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_array_expr (AST::AttrVec outer_attrs = AST::AttrVec (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_grouped_or_tuple_expr (AST::AttrVec outer_attrs = AST::AttrVec (), Location pratt_parsed_loc = Linemap::unknown_location ()); std::unique_ptr parse_struct_expr_field (); bool will_be_expr_with_block (); // Type-related std::unique_ptr parse_type_no_bounds (); std::unique_ptr parse_slice_or_array_type (); std::unique_ptr parse_raw_pointer_type (); std::unique_ptr parse_reference_type_inner (Location locus); std::unique_ptr parse_reference_type (); std::unique_ptr parse_bare_function_type (std::vector for_lifetimes); std::unique_ptr parse_paren_prefixed_type (); std::unique_ptr parse_paren_prefixed_type_no_bounds (); std::unique_ptr parse_for_prefixed_type (); AST::MaybeNamedParam parse_maybe_named_param (AST::AttrVec outer_attrs); // Statement-related /** *Parse a let-statement * LetStatement : * OuterAttribute* * 'let' PatternNoTopAlt ( ':' Type )? ('=' Expression )? ';' * * @param allow_no_semi Allow parsing a let-statement without expecting a * semicolon to follow it */ std::unique_ptr parse_let_stmt (AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_expr_stmt (AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); std::unique_ptr parse_expr_stmt_with_block (AST::AttrVec outer_attrs); std::unique_ptr parse_expr_stmt_without_block (AST::AttrVec outer_attrs, ParseRestrictions restrictions = ParseRestrictions ()); ExprOrStmt parse_stmt_or_expr_without_block (); ExprOrStmt parse_stmt_or_expr_with_block (AST::AttrVec outer_attrs); ExprOrStmt parse_macro_invocation_maybe_semi (AST::AttrVec outer_attrs); ExprOrStmt parse_path_based_stmt_or_expr (AST::AttrVec outer_attrs); // Pattern-related std::unique_ptr parse_literal_or_range_pattern (); std::unique_ptr parse_range_pattern_bound (); std::unique_ptr parse_reference_pattern (); std::unique_ptr parse_grouped_or_tuple_pattern (); std::unique_ptr parse_slice_pattern (); std::unique_ptr parse_ident_leading_pattern (); std::unique_ptr parse_tuple_struct_items (); AST::StructPatternElements parse_struct_pattern_elems (); std::unique_ptr parse_struct_pattern_field (); std::unique_ptr parse_struct_pattern_field_partial (AST::AttrVec outer_attrs); int left_binding_power (const_TokenPtr token); bool done_end (); bool done_end_or_else (); bool done_end_of_file (); void add_error (Error error) { error_table.push_back (std::move (error)); } public: // Construct parser with specified "managed" token source. Parser (ManagedTokenSource &tokenSource) : lexer (tokenSource) {} // Parse items without parsing an entire crate. This function is the main // parsing loop of AST::Crate::parse_crate(). std::vector > parse_items (); // Main entry point for parser. std::unique_ptr parse_crate (); void debug_dump_ast_output (AST::Crate &crate, std::ostream &out); // Returns whether any parsing errors have occurred. bool has_errors () const { return !error_table.empty (); } // Remove all parsing errors from the table void clear_errors () { error_table.clear (); } // Get a reference to the list of errors encountered std::vector &get_errors () { return error_table; } const ManagedTokenSource &get_token_source () const { return lexer; } const_TokenPtr peek_current_token () { return lexer.peek_token (0); } private: // The token source (usually lexer) associated with the parser. ManagedTokenSource &lexer; // The error list. std::vector error_table; // The names of inline modules while parsing. std::vector inline_module_stack; class InlineModuleStackScope { private: Parser &parser; public: InlineModuleStackScope (Parser &parser, std::string name) : parser (parser) { parser.inline_module_stack.emplace_back (std::move (name)); } ~InlineModuleStackScope () { parser.inline_module_stack.pop_back (); } }; }; std::string extract_module_path (const AST::AttrVec &inner_attrs, const AST::AttrVec &outer_attrs, const std::string &name); /** * Check if a MacroMatch is allowed to follow the last parsed MacroMatch. * * @param last_match Last matcher parsed before the current match * @param match Current matcher to check * * @return true if the follow-up is valid, false otherwise */ bool is_match_compatible (const AST::MacroMatch &last_match, const AST::MacroMatch ¤t_match); } // namespace Rust // as now template, include implementations of all methods #include "rust-parse-impl.h" #endif // RUST_PARSE_H