diff --git a/src/eval.rs b/src/eval.rs index df5b4f3..7707b86 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -1,4 +1,4 @@ -use crate::expr::{BinaryOp, Expr, UnaryOp}; +use crate::parser::{BinaryOp, Expr, UnaryOp}; pub struct Evaluator { ast: Expr diff --git a/src/expr.rs b/src/expr.rs deleted file mode 100644 index 7a32386..0000000 --- a/src/expr.rs +++ /dev/null @@ -1,45 +0,0 @@ -#[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/lexer.rs b/src/lexer.rs index a4045c3..0a2bc74 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::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::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::LParen)}, Some(b')') => {self.advance(); Some(Token::RParen)}, diff --git a/src/main.rs b/src/main.rs index f0cd919..4d61fc5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,6 @@ use std::{fs::File, io::Read}; mod token; -mod expr; mod lexer; use lexer::Lexer; mod parser; @@ -31,7 +30,7 @@ fn main() -> std::io::Result<()> { loop { let parsed = parser.parse(); match parsed { - expr::Expr::EOL => break, + parser::Expr::EOL => break, _ => { println!("AST: {:?}", parsed); let eval = Evaluator::new(parsed); diff --git a/src/parser.rs b/src/parser.rs index 1e70723..9e26822 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,5 +1,49 @@ use crate::token::Token; -use crate::expr::{Expr, UnaryOp, BinaryOp, infix_bp, prefix_bp}; + +#[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 + } +} pub struct Parser { tokens: Vec, @@ -46,7 +90,7 @@ impl Parser { fn parse_prefix(&mut self) -> Expr { match self.peek() { - Some(Token::Minus) => { + Some(Token::Sub) => { self.advance(); let op = UnaryOp::Neg; @@ -64,11 +108,11 @@ impl Parser { loop { let op = match self.peek() { - 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, + 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, _ => break }; diff --git a/src/token.rs b/src/token.rs index e5759e8..778263c 100644 --- a/src/token.rs +++ b/src/token.rs @@ -4,11 +4,11 @@ pub enum Token { Ident(String), // Operators - Plus, - Minus, - Asterisk, - Slash, - Percent, + Add, + Sub, + Mul, + Div, + Mod, // Parentheses LParen,