feat(lexer): Add diagnostic and impl error recovering

This commit is contained in:
2026-05-08 22:54:46 +08:00
parent e8b50ae0d7
commit 63a2990826
12 changed files with 525 additions and 120 deletions
+61 -10
View File
@@ -1,4 +1,6 @@
use strum::EnumString;
use strum::{AsRefStr, EnumString};
use crate::diagnostic::span::Span;
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -7,12 +9,6 @@ pub struct Token {
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Span {
pub line: usize,
pub column: usize,
pub length: usize,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TokenValue {
@@ -20,6 +16,61 @@ pub enum TokenValue {
Ident(String),
TypeIdent(TypeIdent),
Plus, Minus, Star, Slash, Percent,
Equal, DoubleEqual, Not, NotEqual, Less, LessEqual, Greater, GreaterEqual,
LParen, RParen,
LBrace, RBrace,
Comma, Semicolon,
If, Else, While, Return, Break, Continue,
// Eof,
Unrecognized,
}
impl std::fmt::Display for TokenValue {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
TokenValue::IntLit(i) => write!(f, "literal int: {}", i),
TokenValue::Ident(s) => write!(f, "identifier: {}", s),
TokenValue::TypeIdent(t) => write!(f, "type {}", t.as_ref()),
TokenValue::Plus => write!(f, "+"),
TokenValue::Minus => write!(f, "-"),
TokenValue::Star => write!(f, "*"),
TokenValue::Slash => write!(f, "/"),
TokenValue::Percent => write!(f, "%"),
TokenValue::Equal => write!(f, "="),
TokenValue::DoubleEqual => write!(f, "=="),
TokenValue::Not => write!(f, "!"),
TokenValue::NotEqual => write!(f, "!="),
TokenValue::Less => write!(f, "<"),
TokenValue::LessEqual => write!(f, "<="),
TokenValue::Greater => write!(f, ">"),
TokenValue::GreaterEqual => write!(f, ">="),
TokenValue::LParen => write!(f, "("),
TokenValue::RParen => write!(f, ")"),
TokenValue::LBrace => write!(f, "{{"),
TokenValue::RBrace => write!(f, "}}"),
TokenValue::Comma => write!(f, ","),
TokenValue::Semicolon => write!(f, ";"),
TokenValue::If => write!(f, "if"),
TokenValue::Else => write!(f, "else"),
TokenValue::While => write!(f, "while"),
TokenValue::Return => write!(f, "return"),
TokenValue::Break => write!(f, "break"),
TokenValue::Continue => write!(f, "continue"),
// TokenValue::Eof => write!(f, "<EOF>"),
TokenValue::Unrecognized => write!(f, "unrecognized"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TokenKind {
IntLit,
Ident,
TypeIdent,
Plus, Minus, Star, Slash, Percent,
Equal, DoubleEqual, NotEqual, Less, LessEqual, Greater, GreaterEqual,
@@ -29,10 +80,10 @@ pub enum TokenValue {
If, Else, While, Return, Break, Continue,
Eof,
Unrecognized(char),
// Eof,
Unrecognized,
}
#[derive(Debug, Clone, PartialEq, Eq, EnumString)]
#[derive(Debug, Clone, PartialEq, Eq, EnumString, AsRefStr)]
pub enum TypeIdent {
#[strum(serialize = "int")]
Int,