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,