valkyrie-parser 0.2.5

The hand write parser of valkyrie language
Documentation
use super::*;

impl ThisParser for LetBindNode {
    fn parse(input: ParseState) -> ParseResult<Self> {
        let (state, _) = input.match_str("let")?;
        let (state, pattern) = state.skip(ignore).match_fn(LetPattern::parse)?;
        let (state, type_hint) = state.match_optional(parse_type_hint)?;
        let (state, body) = state.match_optional(parse_expr)?;
        state.finish(LetBindNode { pattern, type_hint, body })
    }

    fn lispify(&self) -> Lisp {
        let mut lisp = Lisp::new(5);
        lisp += Lisp::keyword("let");
        lisp += self.pattern.lispify();
        if let Some(type_hint) = &self.type_hint {
            lisp += type_hint.lispify();
        }
        if let Some(body) = &self.body {
            lisp += body.lispify();
        }
        lisp
    }
}

fn parse_type_hint(input: ParseState) -> ParseResult<ExpressionNode> {
    let (state, _) = input.skip(ignore).match_str(":")?;
    let (state, expr) = state.skip(ignore).match_fn(TypingExpression::parse)?;
    state.finish(expr.as_normal())
}

fn parse_expr(input: ParseState) -> ParseResult<ExpressionNode> {
    let (state, _) = input.skip(ignore).match_str("=")?;
    let (state, expr) = state.skip(ignore).match_fn(ExpressionNode::parse)?;
    state.finish(expr)
}