mest-core 0.2.0

Core language library for the Mest programming language
Documentation
use std::ops::Range;

use crate::token::Token;
use logos::Logos;

#[derive(Debug)]
pub struct LexError {
    pub span: Range<usize>,
    pub message: Option<String>,
}

pub fn tokenize(src: &str) -> (Vec<(Token, Range<usize>)>, Vec<LexError>) {
    let mut tokens = vec![];
    let mut errors = vec![];

    for (result, span) in Token::lexer(src).spanned() {
        match result {
            Ok(tok) => tokens.push((tok, span)),
            Err(_) => errors.push(LexError {
                message: Some(format!("unexpected character `{}`", &src[span.clone()])),
                span,
            }),
        }
    }

    (tokens, errors)
}