use {SyntaxKind, Token}; #[macro_use] mod parser; mod grammar; /// `Parser` produces a flat list of `Event`s. /// They are converted to a tree-structure in /// a separate pass, via `TreeBuilder`. #[derive(Debug)] pub(crate) enum Event { /// This event signifies the start of the node. /// It should be either abandoned (in which case the /// `kind` is `TOMBSTONE`, and the event is ignored), /// or completed via a `Finish` event. /// /// All tokens between a `Start` and a `Finish` would /// become the children of the respective node. /// /// For left-recursive syntactic constructs, the parser produces /// a child node before it sees a parent. `forward_parent` /// exists to allow to tweak parent-child relationships. /// /// Consider this path /// /// foo::bar /// /// The events for it would look like this: /// /// /// START(PATH) IDENT('foo') FINISH START(PATH) COLONCOLON IDENT('bar') FINISH /// | /\ /// | | /// +------forward-parent------+ /// /// And the tree would look like this /// /// +--PATH---------+ /// | | | /// | | | /// | '::' 'bar' /// | /// PATH /// | /// 'foo' /// /// See also `CompleteMarker::precede`. Start { kind: SyntaxKind, forward_parent: Option, }, /// Complete the previous `Start` event Finish, /// Produce a single leaf-element. /// `n_raw_tokens` is used to glue complex contextual tokens. /// For example, lexer tokenizes `>>` as `>`, `>`, and /// `n_raw_tokens = 2` is used to produced a single `>>`. Token { kind: SyntaxKind, n_raw_tokens: u8, }, Error { message: String, }, } pub(crate) fn parse<'t>(text: &'t str, raw_tokens: &'t [Token]) -> Vec { let mut parser = parser::Parser::new(text, raw_tokens); grammar::file(&mut parser); parser.into_events() }