Skip to main content

Parse

Trait Parse 

Source
pub(crate) trait Parse<'db>: Sized {
    type Output: Update;

    // Required methods
    fn opt_parse(
        db: &'db dyn Db,
        parser: &mut Parser<'_, 'db>,
    ) -> Result<Option<Self::Output>, ParseFail<'db>>;
    fn expected() -> Expected;

    // Provided methods
    fn can_eat(db: &'db dyn Db, parser: &Parser<'_, 'db>) -> bool { ... }
    fn eat(
        db: &'db dyn Db,
        parser: &mut Parser<'_, 'db>,
    ) -> Result<Self::Output, ParseFail<'db>> { ... }
    fn eat_comma(
        db: &'db dyn Db,
        parser: &mut Parser<'_, 'db>,
    ) -> Result<SpanVec<'db, Self::Output>, ParseFail<'db>> { ... }
    fn eat_many(
        db: &'db dyn Db,
        parser: &mut Parser<'_, 'db>,
    ) -> Result<SpanVec<'db, Self::Output>, ParseFail<'db>> { ... }
    fn eat_delimited<T>(
        db: &'db dyn Db,
        parser: &mut Parser<'_, 'db>,
        delimiter: Delimiter,
        eat_method: impl FnOnce(&'db dyn Db, &mut Parser<'_, 'db>) -> Result<T, ParseFail<'db>>,
    ) -> Result<T, ParseFail<'db>> { ... }
    fn opt_parse_delimited<T>(
        db: &'db dyn Db,
        parser: &mut Parser<'_, 'db>,
        delimiter: Delimiter,
        eat_method: impl FnOnce(&'db dyn Db, &mut Parser<'_, 'db>) -> Result<T, ParseFail<'db>>,
    ) -> Result<Option<T>, ParseFail<'db>> { ... }
    fn opt_parse_comma(
        db: &'db dyn Db,
        parser: &mut Parser<'_, 'db>,
    ) -> Result<Option<SpanVec<'db, Self::Output>>, ParseFail<'db>> { ... }
    fn opt_parse_separated(
        db: &'db dyn Db,
        parser: &mut Parser<'_, 'db>,
        separator: Op,
    ) -> Result<Option<SpanVec<'db, Self::Output>>, ParseFail<'db>> { ... }
    fn opt_parse_guarded(
        guard_op: impl ParseGuard,
        db: &'db dyn Db,
        parser: &mut Parser<'_, 'db>,
    ) -> Result<Option<Self::Output>, ParseFail<'db>> { ... }
}
Expand description

Parse an instance of Self from the given Parser.

There are several parsing methods depending on how many instances of Self you wish to parse:

  • opt_parse – 0 or 1 instance (x? in a regex)
  • opt_parse_comma – comma-separated list, returns None if no elements found
  • opt_parse_delimited – delimited comma-separated list, None if no delimiters are found
  • eat – exactly 1 instance (x in a regex`)
  • eat_comma – comma-separated list, returns an empty list if no elements found
  • eat_delimited – delimited comma-separated list where delimiters are mandatory

Implementors need only provide opt_parse, the rest are automatically provided.

§Return values

The opt_parse methods return an Result<Option<_>, ParseFail<'db>> as follows:

  • Ok(Some(v)) – parse succeeded (possibly with recovery, in which case diagnostics will be stored into the Parser).
  • Ok(None) – no instance of Self was found.
  • Err(err) – a malformed instance of Self was found. Some tokens were consumed.

The eat methods return a Result<_, ParseFail<'db>> and hence only distinguish success and error.

§Diagnostics

Parsing something can never report diagnostics to the user. Any diagnostics need to be accumulated in the Parser.

Required Associated Types§

Source

type Output: Update

Required Methods§

Source

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Parse a single instance of Self, returning Ok(Some(v)). Returns Ok(None) if Self was not present or Err(err) if Self appeared to be present but was ill-formed.

Invariants maintained by this method:

  • If Ok(None) is returned, consumed NO tokens and reported NO diagnostics.
  • If Err is returned, consumed at least one token (not true for eat methods).
Source

fn expected() -> Expected

Provided Methods§

Source

fn can_eat(db: &'db dyn Db, parser: &Parser<'_, 'db>) -> bool

Speculatively parses to see if we could eat a Self without any error. Never consumes tokens nor produces an error.

Source

fn eat( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Self::Output, ParseFail<'db>>

Parses an instance of Self from the given Parser, reporting an error if no instance is found.

Source

fn eat_comma( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<SpanVec<'db, Self::Output>, ParseFail<'db>>

Parse zero-or-more comma-separated instances of Self returning a vector. Accepts trailing commas.

Source

fn eat_many( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<SpanVec<'db, Self::Output>, ParseFail<'db>>

Parse zero-or-more instances of Self returning a vector.

Source

fn eat_delimited<T>( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, delimiter: Delimiter, eat_method: impl FnOnce(&'db dyn Db, &mut Parser<'_, 'db>) -> Result<T, ParseFail<'db>>, ) -> Result<T, ParseFail<'db>>

Eat a comma separated list of Self, delimited by delimiter (e.g., (a, b, c)).

Source

fn opt_parse_delimited<T>( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, delimiter: Delimiter, eat_method: impl FnOnce(&'db dyn Db, &mut Parser<'_, 'db>) -> Result<T, ParseFail<'db>>, ) -> Result<Option<T>, ParseFail<'db>>

Parse a delimited list of Self e.g., (a, b, c) or [a, b, c]. Returns None if the given delimiters indicated by delimiter are not found.

Source

fn opt_parse_comma( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<SpanVec<'db, Self::Output>>, ParseFail<'db>>

Parse a comma separated list of Self

Source

fn opt_parse_separated( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, separator: Op, ) -> Result<Option<SpanVec<'db, Self::Output>>, ParseFail<'db>>

Parse a separator separated list of Self

Source

fn opt_parse_guarded( guard_op: impl ParseGuard, db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

If guard_op appears, then parse Self

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<'db> Parse<'db> for AstAggregate<'db>

class Name { … }

Source§

type Output = AstAggregate<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstBlock<'db>

Source§

type Output = AstBlock<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstConstructorField<'db>

Source§

type Output = AstConstructorField<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstExpr<'db>

Source§

type Output = AstExpr<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstFieldDecl<'db>

Source§

type Output = AstFieldDecl<'db>

Source§

fn opt_parse( db: &'db dyn Db, tokens: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstFunction<'db>

Source§

type Output = AstFunction<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstFunctionEffects<'db>

Source§

type Output = AstFunctionEffects<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstFunctionInput<'db>

Source§

type Output = AstFunctionInput<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstGenericDecl<'db>

Source§

type Output = AstGenericDecl<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstGenericKind<'db>

Source§

type Output = AstGenericKind<'db>

Source§

fn opt_parse( _db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstGenericTerm<'db>

Source§

type Output = AstGenericTerm<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstItem<'db>

Source§

type Output = AstItem<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstLetStatement<'db>

Source§

type Output = AstLetStatement<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstMember<'db>

Source§

type Output = AstMember<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstModule<'db>

Source§

type Output = AstModule<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstPath<'db>

Source§

type Output = AstPath<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstPerm<'db>

Source§

type Output = AstPerm<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstSelfArg<'db>

Source§

type Output = AstSelfArg<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstStatement<'db>

Source§

type Output = AstStatement<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstTy<'db>

Source§

type Output = AstTy<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstUse<'db>

use path [as name];

Source§

type Output = AstUse<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstVisibility<'db>

Source§

type Output = AstVisibility<'db>

Source§

fn opt_parse( _db: &'db dyn Db, tokens: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstWhereClause<'db>

Source§

type Output = AstWhereClause<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstWhereClauseKind<'db>

Source§

type Output = AstWhereClauseKind<'db>

Source§

fn opt_parse( _db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for AstWhereClauses<'db>

Source§

type Output = AstWhereClauses<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for Literal<'db>

Source§

fn opt_parse( db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Parses literal values from tokens.

This implementation demonstrates the parser’s commitment model:

  • No commitment: Returns Ok(None) if no literal token is found
  • Commitment: Once a literal token is detected, consumes it and returns the value
  • Error after commitment: If token consumption fails, would return Err (though this is unlikely for literals)
§Supported Literals
  • Tokenizer literals: Integers and strings from TokenKind::Literal
  • Boolean keywords: true and false keywords are treated as boolean literals
§String Literal Processing

For string literals, this method:

  1. Takes the raw text from the tokenizer (with escape sequences still as text)
  2. Creates a Literal::new(db, LiteralKind::String, raw_text)
  3. Does not interpret escape sequences - this is currently a bug

Future implementations should either have the tokenizer pre-process escapes or add escape interpretation here.

Source§

type Output = Literal<'db>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for PermissionOp

Source§

type Output = PermissionOp

Source§

fn opt_parse( _db: &'db dyn Db, parser: &mut Parser<'_, 'db>, ) -> Result<Option<Self::Output>, ParseFail<'db>>

Source§

fn expected() -> Expected

Source§

impl<'db> Parse<'db> for VariableDecl<'db>

Source§

type Output = VariableDecl<'db>

Source§

fn opt_parse( db: &'db dyn Db, tokens: &mut Parser<'_, 'db>, ) -> Result<Option<Self>, ParseFail<'db>>

Source§

fn expected() -> Expected

Implementors§

Source§

impl<'db> Parse<'db> for TyOrPerm<'db>

Source§

impl<'db> Parse<'db> for AstAggregatePrefix<'db>

Source§

impl<'db> Parse<'db> for AstFunctionPrefix<'db>

Source§

impl<'db> Parse<'db> for KeywordPerm

Source§

type Output = AstPerm<'db>