#![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;
pub type Result<T, E = Error> = std::result::Result<T, E>;
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)
}
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)
}