kodept-parse 0.3.0

Simple compiler with dependent types support in mind
Documentation
use nom::branch::alt;
use nom::Parser;
use nom::sequence::separated_pair;
use nom_supreme::ParserExt;

use kodept_core::structure::rlt;

use crate::lexer::{
    Identifier::Identifier,
    Symbol::{Colon, TypeGap},
    Token,
};
use crate::nom::parser::{ParseResult, r#type};
use crate::nom::parser::macros::{function, match_token};
use crate::token_stream::TokenStream;

pub fn typed_parameter(input: TokenStream) -> ParseResult<rlt::TypedParameter> {
    separated_pair(
        match_token!(Token::Identifier(Identifier(_))),
        match_token!(Token::Symbol(Colon)),
        r#type::grammar,
    )
    .context(function!())
    .map(|it| rlt::TypedParameter {
        id: it.0.span.into(),
        parameter_type: it.1,
    })
    .parse(input)
}

pub fn untyped_parameter(input: TokenStream) -> ParseResult<rlt::UntypedParameter> {
    let (rest, id) = match_token!(Token::Identifier(Identifier(_)))
        .context(function!())
        .parse(input)?;
    let (rest, _) = match_token!(Token::Symbol(Colon))
        .precedes(match_token!(Token::Symbol(TypeGap)).cut())
        .opt()
        .parse(rest)?;

    Ok((rest, rlt::UntypedParameter { id: id.span.into() }))
}

pub fn parameter(input: TokenStream) -> ParseResult<rlt::Parameter> {
    alt((
        typed_parameter.map(rlt::Parameter::Typed),
        untyped_parameter.map(rlt::Parameter::Untyped),
    ))
    .context(function!())
    .parse(input)
}