From a3d9723a36653fbb49cd158e7b765d04aff00a0c Mon Sep 17 00:00:00 2001 From: Raptorox <70806316+Raptorox@users.noreply.github.com> Date: Thu, 21 May 2026 17:26:14 +0200 Subject: [PATCH 1/2] move Expr out of parser --- src/eval.rs | 2 +- src/expr.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 3 ++- src/parser.rs | 46 +--------------------------------------------- 4 files changed, 49 insertions(+), 47 deletions(-) create mode 100644 src/expr.rs diff --git a/src/eval.rs b/src/eval.rs index 7707b86..df5b4f3 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -1,4 +1,4 @@ -use crate::parser::{BinaryOp, Expr, UnaryOp}; +use crate::expr::{BinaryOp, Expr, UnaryOp}; pub struct Evaluator { ast: Expr diff --git a/src/expr.rs b/src/expr.rs new file mode 100644 index 0000000..7a32386 --- /dev/null +++ b/src/expr.rs @@ -0,0 +1,45 @@ +#[derive(Debug, Clone)] +pub enum BinaryOp { + Add, + Sub, + Mul, + Div, + Mod +} + +#[derive(Debug, Clone)] +pub enum UnaryOp { + Neg +} + +pub fn prefix_bp(op: &UnaryOp) -> u8 { + match op { + UnaryOp::Neg => 5 + } +} + +pub fn infix_bp(op: &BinaryOp) -> (u8, u8) { + match op { + BinaryOp::Add | BinaryOp::Sub => (1, 2), + BinaryOp::Mul | BinaryOp::Div | BinaryOp::Mod => (3, 4) + } +} + +#[derive(Debug, Clone)] +pub enum Expr { + Number(i64), + Ident(String), + EOL, + + Binary { + op: BinaryOp, + left: Box, + right: Box + }, + + Unary { + op: UnaryOp, + right: Box + } +} + diff --git a/src/main.rs b/src/main.rs index 4d61fc5..f0cd919 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use std::{fs::File, io::Read}; mod token; +mod expr; mod lexer; use lexer::Lexer; mod parser; @@ -30,7 +31,7 @@ fn main() -> std::io::Result<()> { loop { let parsed = parser.parse(); match parsed { - parser::Expr::EOL => break, + expr::Expr::EOL => break, _ => { println!("AST: {:?}", parsed); let eval = Evaluator::new(parsed); diff --git a/src/parser.rs b/src/parser.rs index 9e26822..75b6749 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,49 +1,5 @@ use crate::token::Token; - -#[derive(Debug, Clone)] -pub enum BinaryOp { - Add, - Sub, - Mul, - Div, - Mod -} - -#[derive(Debug, Clone)] -pub enum UnaryOp { - Neg -} - -fn prefix_bp(op: &UnaryOp) -> u8 { - match op { - UnaryOp::Neg => 5 - } -} - -fn infix_bp(op: &BinaryOp) -> (u8, u8) { - match op { - BinaryOp::Add | BinaryOp::Sub => (1, 2), - BinaryOp::Mul | BinaryOp::Div | BinaryOp::Mod => (3, 4) - } -} - -#[derive(Debug, Clone)] -pub enum Expr { - Number(i64), - Ident(String), - EOL, - - Binary { - op: BinaryOp, - left: Box, - right: Box - }, - - Unary { - op: UnaryOp, - right: Box - } -} +use crate::expr::{Expr, UnaryOp, BinaryOp, infix_bp, prefix_bp}; pub struct Parser { tokens: Vec, From 8d2582756db36a69e67ac9d0e0ac6bb3caf1529e Mon Sep 17 00:00:00 2001 From: Raptorox <70806316+Raptorox@users.noreply.github.com> Date: Thu, 21 May 2026 17:28:21 +0200 Subject: [PATCH 2/2] refactor token names --- src/lexer.rs | 10 +++++----- src/parser.rs | 12 ++++++------ src/token.rs | 10 +++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/lexer.rs b/src/lexer.rs index 0a2bc74..a4045c3 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -54,11 +54,11 @@ impl Lexer { Some(b'0' ..= b'9') => self.number(), Some(b'a' ..= b'z' | b'A' ..= b'Z') => self.ident(), - Some(b'+') => {self.advance(); Some(Token::Add)}, - Some(b'-') => {self.advance(); Some(Token::Sub)}, - Some(b'*') => {self.advance(); Some(Token::Mul)}, - Some(b'/') => {self.advance(); Some(Token::Div)}, - Some(b'%') => {self.advance(); Some(Token::Mod)}, + Some(b'+') => {self.advance(); Some(Token::Plus)}, + Some(b'-') => {self.advance(); Some(Token::Minus)}, + Some(b'*') => {self.advance(); Some(Token::Asterisk)}, + Some(b'/') => {self.advance(); Some(Token::Slash)}, + Some(b'%') => {self.advance(); Some(Token::Percent)}, Some(b'(') => {self.advance(); Some(Token::LParen)}, Some(b')') => {self.advance(); Some(Token::RParen)}, diff --git a/src/parser.rs b/src/parser.rs index 75b6749..1e70723 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -46,7 +46,7 @@ impl Parser { fn parse_prefix(&mut self) -> Expr { match self.peek() { - Some(Token::Sub) => { + Some(Token::Minus) => { self.advance(); let op = UnaryOp::Neg; @@ -64,11 +64,11 @@ impl Parser { loop { let op = match self.peek() { - Some(Token::Add) => BinaryOp::Add, - Some(Token::Sub) => BinaryOp::Sub, - Some(Token::Mul) => BinaryOp::Mul, - Some(Token::Div) => BinaryOp::Div, - Some(Token::Mod) => BinaryOp::Mod, + Some(Token::Plus) => BinaryOp::Add, + Some(Token::Minus) => BinaryOp::Sub, + Some(Token::Asterisk) => BinaryOp::Mul, + Some(Token::Slash) => BinaryOp::Div, + Some(Token::Percent) => BinaryOp::Mod, _ => break }; diff --git a/src/token.rs b/src/token.rs index 778263c..e5759e8 100644 --- a/src/token.rs +++ b/src/token.rs @@ -4,11 +4,11 @@ pub enum Token { Ident(String), // Operators - Add, - Sub, - Mul, - Div, - Mod, + Plus, + Minus, + Asterisk, + Slash, + Percent, // Parentheses LParen,