gollum-parser 0.4.0

Parser for the Gollum language
Documentation
//! `gollum-parser`
#![warn(missing_docs)]

#![doc = concat!("\n# Examples\n\n```rust\n", include_str!("../examples/parse_basics.rs"), "\n```\n")]

mod error;
pub mod lexer;
pub(crate) mod parser;

pub use error::Error;
pub use gollum_ast::item::Item;
pub use gollum_ast::term::Term;
pub use lexer::Token;

/// Result type for `gollum-parser`
pub type Result<T, E = Error> = std::result::Result<T, E>;

/// Parse Gollum source text into a list of top-level items.
pub fn parse(source: &str) -> Result<Vec<Item>> {
    use logos::Logos;
    let token_results: Vec<_> = lexer::Token::lexer(source).collect();
    if token_results.iter().any(|r| r.is_err()) {
        return Err(Error::LexError);
    }
    let tokens: Vec<_> = token_results.into_iter().map(|r| r.unwrap()).collect();
    parser::parse_program(&tokens)
}

/// Parse a single term from source text and return a [`Term`].
/// Accepts the same tokenisation rules as `parse` but expects a single term and no trailing dot.
pub fn parse_term(source: &str) -> Result<Term> {
    use logos::Logos;
    let token_results: Vec<_> = lexer::Token::lexer(source).collect();
    if token_results.iter().any(|r| r.is_err()) {
        return Err(Error::LexError);
    }
    let tokens: Vec<_> = token_results.into_iter().map(|r| r.unwrap()).collect();
    parser::parse_single_term(&tokens)
}