/* 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"
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)) {}
// 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::ExprWithoutBlock *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;
};
// Parser implementation for gccrs.
// TODO: if updated to C++20, ManagedTokenSource would be useful as a concept
template class Parser
{
private:
void skip_after_semicolon ();
void skip_after_end ();
void skip_after_end_block ();
void skip_after_next_block ();
void skip_after_end_attribute ();
bool skip_token (TokenId t);
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?
std::vector parse_inner_attributes ();
AST::Attribute parse_inner_attribute ();
std::vector parse_outer_attributes ();
AST::Attribute parse_outer_attribute ();
AST::Attribute parse_attribute_body ();
std::unique_ptr parse_attr_input ();
// 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::GenericArgs parse_path_generic_args ();
AST::GenericArgsBinding parse_generic_args_binding ();
AST::TypePathFunction parse_type_path_function ();
AST::PathInExpression parse_path_in_expression ();
AST::PathExprSegment parse_path_expr_segment ();
AST::QualifiedPathInExpression
parse_qualified_path_in_expression (bool pratt_parse = false);
AST::QualifiedPathType parse_qualified_path_type (bool pratt_parse = false);
AST::QualifiedPathInType parse_qualified_path_in_type ();
// Token tree or macro related
AST::DelimTokenTree parse_delim_token_tree ();
std::unique_ptr parse_token_tree ();
std::unique_ptr
parse_macro_rules_def (std::vector outer_attrs);
std::unique_ptr
parse_macro_invocation_semi (std::vector outer_attrs);
std::unique_ptr
parse_macro_invocation (std::vector 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::vector > parse_items ();
std::unique_ptr parse_item (bool called_from_statement);
std::unique_ptr
parse_vis_item (std::vector outer_attrs);
std::unique_ptr
parse_macro_item (std::vector outer_attrs);
AST::Visibility parse_visibility ();
// VisItem subclass-related
std::unique_ptr
parse_module (AST::Visibility vis, std::vector outer_attrs);
std::unique_ptr
parse_extern_crate (AST::Visibility vis,
std::vector outer_attrs);
std::unique_ptr
parse_use_decl (AST::Visibility vis, std::vector outer_attrs);
std::unique_ptr parse_use_tree ();
std::unique_ptr
parse_function (AST::Visibility vis, std::vector outer_attrs);
AST::FunctionQualifiers parse_function_qualifiers ();
std::vector >
parse_generic_params_in_angles ();
std::vector > parse_generic_params ();
template
std::vector >
parse_generic_params (EndTokenPred is_end_token);
std::vector > parse_lifetime_params ();
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,
std::vector outer_attrs);
std::unique_ptr
parse_struct (AST::Visibility vis, std::vector 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, std::vector 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, std::vector outer_attrs);
std::unique_ptr
parse_const_item (AST::Visibility vis,
std::vector outer_attrs);
std::unique_ptr
parse_static_item (AST::Visibility vis,
std::vector outer_attrs);
std::unique_ptr
parse_trait (AST::Visibility vis, std::vector outer_attrs);
std::unique_ptr parse_trait_item ();
std::unique_ptr
parse_trait_type (std::vector outer_attrs);
std::unique_ptr
parse_trait_const (std::vector outer_attrs);
AST::SelfParam parse_self_param ();
std::unique_ptr
parse_impl (AST::Visibility vis, std::vector outer_attrs);
std::unique_ptr parse_inherent_impl_item ();
std::unique_ptr
parse_inherent_impl_function_or_method (
AST::Visibility vis, std::vector outer_attrs);
std::unique_ptr parse_trait_impl_item ();
std::unique_ptr
parse_trait_impl_function_or_method (AST::Visibility vis,
std::vector outer_attrs);
std::unique_ptr
parse_extern_block (AST::Visibility vis,
std::vector outer_attrs);
std::unique_ptr parse_external_item ();
AST::NamedFunctionParam
parse_named_function_param (std::vector outer_attrs
= std::vector ());
AST::Method parse_method ();
// Expression-related (Pratt parsed)
std::unique_ptr parse_expr (std::vector outer_attrs
= std::vector (),
ParseRestrictions restrictions
= ParseRestrictions ());
std::unique_ptr parse_expr (int right_binding_power,
std::vector outer_attrs
= std::vector (),
ParseRestrictions restrictions
= ParseRestrictions ());
std::unique_ptr
null_denotation (const_TokenPtr t,
std::vector outer_attrs
= std::vector (),
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
left_denotation (const_TokenPtr t, std::unique_ptr left,
std::vector outer_attrs
= std::vector (),
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_arithmetic_or_logical_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
AST::ArithmeticOrLogicalExpr::ExprType expr_type,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_binary_plus_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions
= ParseRestrictions ());
std::unique_ptr
parse_binary_minus_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions
= ParseRestrictions ());
std::unique_ptr
parse_binary_mult_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions
= ParseRestrictions ());
std::unique_ptr
parse_binary_div_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_binary_mod_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_bitwise_and_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions
= ParseRestrictions ());
std::unique_ptr
parse_bitwise_or_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_bitwise_xor_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions
= ParseRestrictions ());
std::unique_ptr
parse_left_shift_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_right_shift_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions
= ParseRestrictions ());
std::unique_ptr
parse_comparison_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
AST::ComparisonExpr::ExprType expr_type,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_binary_equal_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions
= ParseRestrictions ());
std::unique_ptr parse_binary_not_equal_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr parse_binary_greater_than_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr parse_binary_less_than_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr parse_binary_greater_equal_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr parse_binary_less_equal_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_lazy_or_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_lazy_and_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_type_cast_expr (const_TokenPtr tok,
std::unique_ptr expr_to_cast,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_assig_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr parse_compound_assignment_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
AST::CompoundAssignmentExpr::ExprType expr_type,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_plus_assig_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_minus_assig_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions
= ParseRestrictions ());
std::unique_ptr
parse_mult_assig_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_div_assig_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_mod_assig_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_and_assig_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_or_assig_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_xor_assig_expr (const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr parse_left_shift_assig_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr parse_right_shift_assig_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_await_expr (const_TokenPtr tok,
std::unique_ptr expr_to_await,
std::vector outer_attrs);
std::unique_ptr parse_method_call_expr (
const_TokenPtr tok, std::unique_ptr receiver_expr,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr parse_function_call_expr (
const_TokenPtr tok, std::unique_ptr function_expr,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr parse_led_range_exclusive_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_nud_range_exclusive_expr (const_TokenPtr tok,
std::vector outer_attrs);
std::unique_ptr parse_range_inclusive_expr (
const_TokenPtr tok, std::unique_ptr left,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_range_to_inclusive_expr (const_TokenPtr tok,
std::vector outer_attrs);
std::unique_ptr parse_tuple_index_expr (
const_TokenPtr tok, std::unique_ptr tuple_expr,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr parse_field_access_expr (
const_TokenPtr tok, std::unique_ptr struct_expr,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_index_expr (const_TokenPtr tok, std::unique_ptr array_expr,
std::vector outer_attrs,
ParseRestrictions restrictions = ParseRestrictions ());
std::unique_ptr
parse_macro_invocation_partial (AST::PathInExpression path,
std::vector outer_attrs);
std::unique_ptr
parse_struct_expr_struct_partial (AST::PathInExpression path,
std::vector outer_attrs);
std::unique_ptr
parse_struct_expr_tuple_partial (AST::PathInExpression path,
std::vector outer_attrs);
AST::PathInExpression parse_path_in_expression_pratt (const_TokenPtr tok);
std::unique_ptr
parse_closure_expr_pratt (const_TokenPtr tok,
std::vector outer_attrs
= std::vector ());
std::unique_ptr