kodept-parse 0.3.0

Simple compiler with dependent types support in mind
Documentation
use cfg_if::cfg_if;

use kodept_core::structure::rlt::RLT;

use crate::common::{ErrorAdapter, RLTProducer};
use crate::error::{Original, ParseErrors};
use crate::lexer::Token;
use crate::token_stream::TokenStream;

cfg_if! {
    if #[cfg(feature = "peg")] {
        pub type DefaultParser = PegParser<false>;
    } else if #[cfg(feature = "nom")] {
        pub type DefaultParser = NomParser;
    } else {
        compile_error!("Either feature `peg` or `nom` must be enabled for this crate");
    }
}

#[cfg(feature = "nom")]
pub type NomParser = crate::nom::Parser;
#[cfg(feature = "peg")]
pub type PegParser<const TRACE: bool> = crate::peg::Parser<TRACE>;

pub fn parse_from_top<'t, A, E, P>(input: TokenStream<'t>, parser: P) -> Result<RLT, ParseErrors<A>>
where
    P: RLTProducer<Error<'t> = E>,
    E: ErrorAdapter<A, TokenStream<'t>>,
    TokenStream<'t>: Original<A>,
{
    match parser.parse_rlt(input) {
        Ok(x) => Ok(x),
        Err(e) => Err(e.adapt(input, 0)),
    }
}

pub fn default_parse_from_top(input: TokenStream) -> Result<RLT, ParseErrors<Token>>
{
    parse_from_top(input, DefaultParser::new())
}