lark-parser 0.1.0

Parser for the Lark language.
use crate::lexer::token::LexToken;
use crate::parser::Parser;
use crate::syntax::expression::scope::ExpressionScope;
use crate::syntax::Syntax;
use derive_new::new;
use lark_debug_derive::DebugWith;
use lark_error::ErrorReported;
use lark_hir as hir;
use lark_intern::Intern;

#[derive(new, DebugWith)]
crate struct Literal<'me, 'parse> {
    scope: &'me mut ExpressionScope<'parse>,
}

impl Syntax<'parse> for Literal<'me, 'parse> {
    type Data = hir::Expression;

    fn test(&mut self, parser: &Parser<'parse>) -> bool {
        parser.is(LexToken::Integer) || parser.is(LexToken::String)
    }

    fn expect(&mut self, parser: &mut Parser<'parse>) -> Result<Self::Data, ErrorReported> {
        let text = parser.peek_str();
        let token = parser.shift();
        let kind = match token.value {
            LexToken::Integer => hir::LiteralKind::UnsignedInteger,
            LexToken::String => hir::LiteralKind::String,
            _ => return Err(parser.report_error("expected a literal", token.span)),
        };
        let value = text.intern(parser);
        let data = hir::LiteralData { kind, value };
        Ok(self
            .scope
            .add(token.span, hir::ExpressionData::Literal { data }))
    }
}