Struct syntex_syntax::parse::parser::Parser [] [src]

pub struct Parser<'a> {
    pub sess: &'a ParseSess,
    pub token: Token,
    pub span: Span,
    pub prev_span: Span,
    pub cfg: CrateConfig,
    pub buffer: [TokenAndSpan; 4],
    pub buffer_start: isize,
    pub buffer_end: isize,
    pub tokens_consumed: usize,
    pub restrictions: Restrictions,
    pub quote_depth: usize,
    pub reader: Box<Reader + 'a>,
    pub obsolete_set: HashSet<ObsoleteSyntax>,
    pub directory: PathBuf,
    pub open_braces: Vec<(DelimToken, Span)>,
    pub owns_directory: bool,
    pub root_module_name: Option<String>,
    pub expected_tokens: Vec<TokenType>,
    // some fields omitted
}

Fields

sess: &'a ParseSess token: Token

the current token:

span: Span

the span of the current token:

prev_span: Span

the span of the previous token:

cfg: CrateConfig buffer: [TokenAndSpan; 4] buffer_start: isize buffer_end: isize tokens_consumed: usize restrictions: Restrictions quote_depth: usize reader: Box<Reader + 'a> obsolete_set: HashSet<ObsoleteSyntax>

The set of seen errors about obsolete syntax. Used to suppress extra detail when the same error is seen twice

directory: PathBuf

Used to determine the path to externally loaded source files

open_braces: Vec<(DelimToken, Span)>

Stack of open delimiters and their spans. Used for error message.

owns_directory: bool

Flag if this parser "owns" the directory that it is currently parsing in. This will affect how nested files are looked up.

root_module_name: Option<String>

Name of the root module this parser originated from. If None, then the name is not known. This does not change while the parser is descending into modules, and sub-parsers have new values for this name.

expected_tokens: Vec<TokenType>

Methods

impl<'a> Parser<'a>
[src]

fn new(sess: &'a ParseSess, cfg: CrateConfig, rdr: Box<Reader + 'a>) -> Parser<'a>

fn token_to_string(token: &Token) -> String

Convert a token to a string using self's reader

fn this_token_to_string(&self) -> String

Convert the current token to a string using self's reader

fn this_token_descr(&self) -> String

fn unexpected_last<T>(&self, t: &Token) -> PResult<'a, T>

fn unexpected<T>(&mut self) -> PResult<'a, T>

fn expect(&mut self, t: &Token) -> PResult<'a, ()>

Expect and consume the token t. Signal an error if the next token is not t.

fn expect_one_of(&mut self, edible: &[Token], inedible: &[Token]) -> PResult<'a, ()>

Expect next token to be edible or inedible token. If edible, then consume it; if inedible, then return without consuming anything. Signal a fatal error if next token is unexpected.

fn parse_ident(&mut self) -> PResult<'a, Ident>

fn check(&mut self, tok: &Token) -> bool

Check if the next token is tok, and return true if so.

This method will automatically add tok to expected_tokens if tok is not encountered.

fn eat(&mut self, tok: &Token) -> bool

Consume token 'tok' if it exists. Returns true if the given token was present, false otherwise.

fn check_keyword(&mut self, kw: Keyword) -> bool

fn eat_keyword(&mut self, kw: Keyword) -> bool

If the next token is the given keyword, eat it and return true. Otherwise, return false.

fn eat_keyword_noexpect(&mut self, kw: Keyword) -> bool

fn check_contextual_keyword(&mut self, ident: Ident) -> bool

fn eat_contextual_keyword(&mut self, ident: Ident) -> bool

fn expect_keyword(&mut self, kw: Keyword) -> PResult<'a, ()>

If the given word is not a keyword, signal an error. If the next token is not the given word, signal an error. Otherwise, eat it.

fn check_strict_keywords(&mut self)

Signal an error if the given string is a strict keyword

fn check_reserved_keywords(&mut self)

Signal an error if the current token is a reserved keyword

fn expect_no_suffix(&self, sp: Span, kind: &str, suffix: Option<Name>)

fn expect_gt(&mut self) -> PResult<'a, ()>

Expect and consume a GT. if a >> is seen, replace it with a single > and continue. If a GT is not seen, signal an error.

fn parse_seq_to_before_gt_or_return<T, F>(&mut self, sep: Option<Token>, f: F) -> PResult<'a, (P<[T]>, bool)> where F: FnMut(&mut Parser<'a>) -> PResult<'a, Option<T>>

fn parse_seq_to_before_gt<T, F>(&mut self, sep: Option<Token>, f: F) -> PResult<'a, P<[T]>> where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>

Parse a sequence bracketed by '<' and '>', stopping before the '>'.

fn parse_seq_to_gt<T, F>(&mut self, sep: Option<Token>, f: F) -> PResult<'a, P<[T]>> where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>

fn parse_seq_to_gt_or_return<T, F>(&mut self, sep: Option<Token>, f: F) -> PResult<'a, (P<[T]>, bool)> where F: FnMut(&mut Parser<'a>) -> PResult<'a, Option<T>>

fn eat_to_tokens(&mut self, kets: &[&Token])

Eat and discard tokens until one of kets is encountered. Respects token trees, passes through any errors encountered. Used for error recovery.

fn parse_seq_to_end<T, F>(&mut self, ket: &Token, sep: SeqSep, f: F) -> PResult<'a, Vec<T>> where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>

Parse a sequence, including the closing delimiter. The function f must consume tokens until reaching the next separator or closing bracket.

fn parse_seq_to_before_end<T, F>(&mut self, ket: &Token, sep: SeqSep, f: F) -> Vec<T> where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>

Parse a sequence, not including the closing delimiter. The function f must consume tokens until reaching the next separator or closing bracket.

fn parse_unspanned_seq<T, F>(&mut self, bra: &Token, ket: &Token, sep: SeqSep, f: F) -> PResult<'a, Vec<T>> where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>

Parse a sequence, including the closing delimiter. The function f must consume tokens until reaching the next separator or closing bracket.

fn parse_seq<T, F>(&mut self, bra: &Token, ket: &Token, sep: SeqSep, f: F) -> PResult<'a, Spanned<Vec<T>>> where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>

fn bump(&mut self)

Advance the parser by one token

fn bump_and_get(&mut self) -> Token

Advance the parser by one token and return the bumped token.

fn bump_with(&mut self, next: Token, lo: BytePos, hi: BytePos)

Advance the parser using provided token as a next one. Use this when consuming a part of a token. For example a single < from <<.

fn buffer_length(&mut self) -> isize

fn look_ahead<R, F>(&mut self, distance: usize, f: F) -> R where F: FnOnce(&Token) -> R

fn fatal(&self, m: &str) -> DiagnosticBuilder<'a>

fn span_fatal(&self, sp: Span, m: &str) -> DiagnosticBuilder<'a>

fn span_fatal_help(&self, sp: Span, m: &str, help: &str) -> DiagnosticBuilder<'a>

fn bug(&self, m: &str) -> !

fn warn(&self, m: &str)

fn span_warn(&self, sp: Span, m: &str)

fn span_err(&self, sp: Span, m: &str)

fn span_err_help(&self, sp: Span, m: &str, h: &str)

fn span_bug(&self, sp: Span, m: &str) -> !

fn abort_if_errors(&self)

fn diagnostic(&self) -> &'a Handler

fn id_to_interned_str(&mut self, id: Ident) -> InternedString

fn token_is_bare_fn_keyword(&mut self) -> bool

Is the current token one of the keywords that signals a bare function type?

fn get_lifetime(&mut self) -> Ident

fn parse_for_in_type(&mut self) -> PResult<'a, TyKind>

fn parse_impl_trait_type(&mut self) -> PResult<'a, TyKind>

fn parse_ty_path(&mut self) -> PResult<'a, TyKind>

fn parse_ty_bare_fn(&mut self, lifetime_defs: Vec<LifetimeDef>) -> PResult<'a, TyKind>

parse a TyKind::BareFn type:

fn parse_unsafety(&mut self) -> PResult<'a, Unsafety>

fn parse_trait_item(&mut self) -> PResult<'a, TraitItem>

Parse the items in a trait declaration

fn parse_trait_items(&mut self) -> PResult<'a, Vec<TraitItem>>

Parse the items in a trait declaration

fn parse_mt(&mut self) -> PResult<'a, MutTy>

Parse a possibly mutable type

fn parse_ret_ty(&mut self) -> PResult<'a, FunctionRetTy>

Parse optional return type [ -> TY ] in function decl

fn parse_ty_sum(&mut self) -> PResult<'a, P<Ty>>

Parse a type in a context where T1+T2 is allowed.

fn parse_ty(&mut self) -> PResult<'a, P<Ty>>

Parse a type.

fn parse_borrowed_pointee(&mut self) -> PResult<'a, TyKind>

fn parse_ptr(&mut self) -> PResult<'a, MutTy>

fn is_named_argument(&mut self) -> bool

fn parse_arg_general(&mut self, require_name: bool) -> PResult<'a, Arg>

This version of parse arg doesn't necessarily require identifier names.

fn parse_arg(&mut self) -> PResult<'a, Arg>

Parse a single function argument

fn parse_fn_block_arg(&mut self) -> PResult<'a, Arg>

Parse an argument in a lambda header e.g. |arg, arg|

fn maybe_parse_fixed_length_of_vec(&mut self) -> PResult<'a, Option<P<Expr>>>

fn parse_lit_token(&mut self) -> PResult<'a, LitKind>

Matches token_lit = LIT_INTEGER | ...

fn parse_lit(&mut self) -> PResult<'a, Lit>

Matches lit = true | false | token_lit

fn parse_pat_literal_maybe_minus(&mut self) -> PResult<'a, P<Expr>>

matches '-' lit | lit

fn parse_path_segment_ident(&mut self) -> PResult<'a, Ident>

fn parse_qualified_path(&mut self, mode: PathStyle) -> PResult<'a, (QSelf, Path)>

Parses qualified path.

Assumes that the leading < has been parsed already.

Qualifed paths are a part of the universal function call syntax (UFCS).

qualified_path = <type [as trait_ref]>::path

See parse_path for mode meaning.

Examples:

<T as U>::a <T as U>::F::a::<S>

fn parse_path(&mut self, mode: PathStyle) -> PResult<'a, Path>

Parses a path and optional type parameter bounds, depending on the mode. The mode parameter determines whether lifetimes, types, and/or bounds are permitted and whether :: must precede type parameter groups.

fn parse_path_segments_without_colons(&mut self) -> PResult<'a, Vec<PathSegment>>

Examples: - a::b<T,U>::c<V,W> - a::b<T,U>::c(V) -> W - a::b<T,U>::c(V)

fn parse_path_segments_with_colons(&mut self) -> PResult<'a, Vec<PathSegment>>

Examples: - a::b::<T,U>::c

fn parse_path_segments_without_types(&mut self) -> PResult<'a, Vec<PathSegment>>

Examples: - a::b::c

fn parse_opt_lifetime(&mut self) -> PResult<'a, Option<Lifetime>>

parses 0 or 1 lifetime

fn parse_lifetime(&mut self) -> PResult<'a, Lifetime>

Parses a single lifetime Matches lifetime = LIFETIME

fn parse_lifetime_defs(&mut self, followed_by_ty_params: Option<&mut Vec<Attribute>>) -> PResult<'a, Vec<LifetimeDef>>

Parses lifetime_defs = [ lifetime_defs { ',' lifetime_defs } ] where lifetime_def = lifetime [':' lifetimes]

If followed_by_ty_params is None, then we are in a context where only lifetime parameters are allowed, and thus we should error if we encounter attributes after the bound lifetimes.

If followed_by_ty_params is Some(r), then there may be type parameter bindings after the lifetimes, so we should pass along the parsed attributes to be attached to the first such type parmeter.

fn parse_lifetimes(&mut self, sep: Token) -> PResult<'a, Vec<Lifetime>>

matches lifetimes = ( lifetime ) | ( lifetime , lifetimes ) actually, it matches the empty one too, but putting that in there messes up the grammar....

Parses zero or more comma separated lifetimes. Expects each lifetime to be followed by either a comma or >. Used when parsing type parameter lists, where we expect something like <'a, 'b, T>.

fn parse_mutability(&mut self) -> PResult<'a, Mutability>

Parse mutability (mut or nothing).

fn parse_field_name(&mut self) -> PResult<'a, Ident>

fn parse_field(&mut self) -> PResult<'a, Field>

Parse ident COLON expr

fn mk_expr(&mut self, lo: BytePos, hi: BytePos, node: ExprKind, attrs: ThinVec<Attribute>) -> P<Expr>

fn mk_unary(&mut self, unop: UnOp, expr: P<Expr>) -> ExprKind

fn mk_binary(&mut self, binop: BinOp, lhs: P<Expr>, rhs: P<Expr>) -> ExprKind

fn mk_call(&mut self, f: P<Expr>, args: Vec<P<Expr>>) -> ExprKind

fn mk_index(&mut self, expr: P<Expr>, idx: P<Expr>) -> ExprKind

fn mk_range(&mut self, start: Option<P<Expr>>, end: Option<P<Expr>>, limits: RangeLimits) -> PResult<'a, ExprKind>

fn mk_field(&mut self, expr: P<Expr>, ident: SpannedIdent) -> ExprKind

fn mk_tup_field(&mut self, expr: P<Expr>, idx: Spanned<usize>) -> ExprKind

fn mk_assign_op(&mut self, binop: BinOp, lhs: P<Expr>, rhs: P<Expr>) -> ExprKind

fn mk_mac_expr(&mut self, lo: BytePos, hi: BytePos, m: Mac_, attrs: ThinVec<Attribute>) -> P<Expr>

fn mk_lit_u32(&mut self, i: u32, attrs: ThinVec<Attribute>) -> P<Expr>

fn parse_block_expr(&mut self, lo: BytePos, blk_mode: BlockCheckMode, outer_attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>>

Parse a block or unsafe block

fn parse_dot_or_call_expr(&mut self, already_parsed_attrs: Option<ThinVec<Attribute>>) -> PResult<'a, P<Expr>>

parse a.b or a(13) or a[4] or just a

fn parse_dot_or_call_expr_with(&mut self, e0: P<Expr>, lo: BytePos, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>>

fn check_unknown_macro_variable(&mut self)

fn parse_sep_and_kleene_op(&mut self) -> PResult<'a, (Option<Token>, KleeneOp)>

Parse an optional separator followed by a Kleene-style repetition token (+ or *).

fn parse_token_tree(&mut self) -> PResult<'a, TokenTree>

parse a single token tree from the input.

fn parse_all_token_trees(&mut self) -> PResult<'a, Vec<TokenTree>>

fn parse_prefix_expr(&mut self, already_parsed_attrs: Option<ThinVec<Attribute>>) -> PResult<'a, P<Expr>>

Parse a prefix-unary-operator expr

fn parse_assoc_expr(&mut self, already_parsed_attrs: Option<ThinVec<Attribute>>) -> PResult<'a, P<Expr>>

Parse an associative expression

This parses an expression accounting for associativity and precedence of the operators in the expression.

fn parse_assoc_expr_with(&mut self, min_prec: usize, lhs: LhsExpr) -> PResult<'a, P<Expr>>

Parse an associative expression with operators of at least min_prec precedence

fn parse_if_expr(&mut self, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>>

Parse an 'if' or 'if let' expression ('if' token already eaten)

fn parse_if_let_expr(&mut self, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>>

Parse an 'if let' expression ('if' token already eaten)

fn parse_lambda_expr(&mut self, lo: BytePos, capture_clause: CaptureBy, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>>

fn parse_else_expr(&mut self) -> PResult<'a, P<Expr>>

fn parse_for_expr(&mut self, opt_ident: Option<SpannedIdent>, span_lo: BytePos, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>>

Parse a 'for' .. 'in' expression ('for' token already eaten)

fn parse_while_expr(&mut self, opt_ident: Option<SpannedIdent>, span_lo: BytePos, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>>

Parse a 'while' or 'while let' expression ('while' token already eaten)

fn parse_while_let_expr(&mut self, opt_ident: Option<SpannedIdent>, span_lo: BytePos, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>>

Parse a 'while let' expression ('while' token already eaten)

fn parse_loop_expr(&mut self, opt_ident: Option<SpannedIdent>, span_lo: BytePos, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>>

fn parse_arm(&mut self) -> PResult<'a, Arm>

fn parse_expr(&mut self) -> PResult<'a, P<Expr>>

Parse an expression

fn with_res<F, T>(&mut self, r: Restrictions, f: F) -> T where F: FnOnce(&mut Self) -> T

Evaluate the closure with restrictions in place.

After the closure is evaluated, restrictions are reset.

fn parse_expr_res(&mut self, r: Restrictions, already_parsed_attrs: Option<ThinVec<Attribute>>) -> PResult<'a, P<Expr>>

Parse an expression, subject to the given restrictions

fn parse_pat(&mut self) -> PResult<'a, P<Pat>>

Parse a pattern.

fn parse_stmt(&mut self) -> PResult<'a, Option<Stmt>>

Parse a statement. This stops just before trailing semicolons on everything but items. e.g. a StmtKind::Semi parses to a StmtKind::Expr, leaving the trailing ; unconsumed.

fn parse_block(&mut self) -> PResult<'a, P<Block>>

Parse a block. No inner attrs are allowed.

fn parse_full_stmt(&mut self, macro_legacy_warnings: bool) -> PResult<'a, Option<Stmt>>

Parse a statement, including the trailing semicolon.

fn parse_generics(&mut self) -> PResult<'a, Generics>

Parse a set of optional generic type parameter declarations. Where clauses are not parsed here, and must be added later via parse_where_clause().

matches generics = ( ) | ( < > ) | ( < typaramseq ( , )? > ) | ( < lifetimes ( , )? > ) | ( < lifetimes , typaramseq ( , )? > ) where typaramseq = ( typaram ) | ( typaram , typaramseq )

fn parse_where_clause(&mut self) -> PResult<'a, WhereClause>

Parses an optional where clause and places it in generics.

where T : Trait<U, V> + 'b, 'a : 'b

fn parse_fn_decl(&mut self, allow_variadic: bool) -> PResult<'a, P<FnDecl>>

Parse the argument list and result type of a function declaration

fn is_const_item(&mut self) -> bool

true if we are looking at const ID, false for things like const fn etc

fn parse_fn_front_matter(&mut self) -> PResult<'a, (Spanned<Constness>, Unsafety, Abi)>

parses all the "front matter" for a fn declaration, up to and including the fn keyword:

  • const fn
  • unsafe fn
  • const unsafe fn
  • extern fn
  • etc

fn parse_impl_item(&mut self) -> PResult<'a, ImplItem>

Parse an impl item.

fn parse_record_struct_body(&mut self) -> PResult<'a, Vec<StructField>>

fn parse_tuple_struct_body(&mut self) -> PResult<'a, Vec<StructField>>

fn parse_single_struct_field(&mut self, lo: BytePos, vis: Visibility, attrs: Vec<Attribute>) -> PResult<'a, StructField>

Parse a structure field declaration

fn submod_path_from_attr(attrs: &[Attribute], dir_path: &Path) -> Option<PathBuf>

fn default_submod_path(id: Ident, dir_path: &Path, codemap: &CodeMap) -> ModulePath

Returns either a path to a module, or .

fn parse_item(&mut self) -> PResult<'a, Option<P<Item>>>

fn parse_crate_mod(&mut self) -> PResult<'a, Crate>

Parses a source module as a crate. This is the main entry point for the parser.

fn parse_optional_str(&mut self) -> Option<(InternedString, StrStyle, Option<Name>)>

fn parse_str(&mut self) -> PResult<'a, (InternedString, StrStyle)>

impl<'a> Parser<'a>
[src]

fn parse_outer_attributes(&mut self) -> PResult<'a, Vec<Attribute>>

Parse attributes that appear before an item

fn parse_attribute(&mut self, permit_inner: bool) -> PResult<'a, Attribute>

Matches attribute = # ! [ meta_item ]

If permit_inner is true, then a leading ! indicates an inner attribute

fn parse_inner_attributes(&mut self) -> PResult<'a, Vec<Attribute>>

Parse attributes that appear after the opening of an item. These should be preceded by an exclamation mark, but we accept and warn about one terminated by a semicolon. matches inner_attrs*

fn parse_meta_item(&mut self) -> PResult<'a, P<MetaItem>>

Per RFC#1559, matches the following grammar:

meta_item : IDENT ( '=' UNSUFFIXED_LIT | '(' meta_item_inner? ')' )? ; meta_item_inner : (meta_item | UNSUFFIXED_LIT) (',' meta_item_inner)? ;

impl<'a> Parser<'a>
[src]

fn parse_expansion(&mut self, kind: ExpansionKind, macro_legacy_warnings: bool) -> PResult<'a, Expansion>

fn ensure_complete_parse(&mut self, macro_name: Name, kind_name: &str, span: Span)

Trait Implementations

impl<'a> ParserObsoleteMethods for Parser<'a>
[src]

fn obsolete(&mut self, sp: Span, kind: ObsoleteSyntax)

Reports an obsolete syntax non-fatal error.

fn report(&mut self, sp: Span, kind: ObsoleteSyntax, kind_str: &str, desc: &str, error: bool)