feat(parser): Impl parser for basic functionality

This commit is contained in:
2026-05-09 11:20:26 +08:00
parent 3cb698cc5d
commit 567057fd76
6 changed files with 815 additions and 33 deletions
+38 -22
View File
@@ -28,31 +28,47 @@ pub enum TokenValue {
// Eof,
Unrecognized,
}
impl TokenValue {
pub fn as_type_ident(&self) -> Option<TypeIdent> {
if let TokenValue::TypeIdent(t) = self {
Some(t.clone())
} else {
None
}
}
pub fn as_ident(&self) -> Option<String> {
if let TokenValue::Ident(s) = self {
Some(s.clone())
} else {
None
}
}
}
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::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::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"),
@@ -83,7 +99,7 @@ pub enum TokenKind {
// Eof,
Unrecognized,
}
#[derive(Debug, Clone, PartialEq, Eq, EnumString, AsRefStr)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, EnumString, AsRefStr)]
pub enum TypeIdent {
#[strum(serialize = "int")]
Int,