From 355d132ba32d1934a245af975d664bd790538f7b Mon Sep 17 00:00:00 2001 From: min Date: Fri, 19 Sep 2025 16:02:18 -0400 Subject: [PATCH] collect top level exprs --- src/compiler.rs | 3 +++ src/lexer.rs | 4 ++-- src/main.rs | 2 +- src/parser.rs | 4 ++-- src/parser/util.rs | 60 +++++++++++++++++++++++----------------------- 5 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/compiler.rs b/src/compiler.rs index f7f56c8..bdb1f14 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -10,6 +10,7 @@ struct AnalysisScope { prev: Option, next: Vec, idents: Vec<(Ident, u16)>, + top_level_exprs: Vec, } impl AnalysisScope { @@ -102,7 +103,9 @@ impl Analyzer { Expr::Block(a) => { // blocks have their own scope self.new_scope(); + let sc = self.get_scope(); // analyze the contents in the new scope + sc.top_level_exprs = a.exprs.clone(); for e in a.exprs { self.analyze(e); } diff --git a/src/lexer.rs b/src/lexer.rs index d1821ad..2e896d9 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -6,7 +6,7 @@ use std::{ use crate::kinds; -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq, Eq, Clone)] pub struct Ident(String); impl fmt::Display for Ident { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -14,7 +14,7 @@ impl fmt::Display for Ident { } } -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum Literal { String(String), Integer(i64), diff --git a/src/main.rs b/src/main.rs index 54f57df..fbd2397 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,7 @@ fn main() { let block = parser.parse().unwrap(); println!("Parse took {:?}", start.elapsed()); let e = parser::Expr::Block(block); - // parser::util::display(e); + parser::util::display(&e); let start = Instant::now(); let mut analysis = compiler::Analyzer::new(); analysis.analyze(e); diff --git a/src/parser.rs b/src/parser.rs index 4a55a67..d7a8505 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -7,7 +7,7 @@ use crate::{ pub mod util; -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum Expr { // Data and variables Assign(Box, Box), @@ -46,7 +46,7 @@ pub enum Expr { DivideAssign(Box, Box), } -#[derive(Debug, Default)] +#[derive(Debug, Default, Clone)] pub struct Block { pub exprs: Vec, } diff --git a/src/parser/util.rs b/src/parser/util.rs index 0c46cfb..68c28ff 100644 --- a/src/parser/util.rs +++ b/src/parser/util.rs @@ -2,12 +2,12 @@ use std::fmt::Write; use crate::parser::Expr; -pub fn display(e: Expr) { +pub fn display(e: &Expr) { let result = fmt_expr(e, 0); println!("{result}"); } -fn fmt_binop(left: Expr, right: Expr, op: &str, depth: usize) -> String { +fn fmt_binop(left: &Expr, right: &Expr, op: &str, depth: usize) -> String { format!( "({} {} {})", fmt_expr(left, depth), @@ -16,16 +16,16 @@ fn fmt_binop(left: Expr, right: Expr, op: &str, depth: usize) -> String { ) } -fn fmt_expr(e: Expr, depth: usize) -> String { +fn fmt_expr(e: &Expr, depth: usize) -> String { match e { - Expr::Assign(l, r) => fmt_binop(*l, *r, "=", depth), - Expr::AddAssign(l, r) => fmt_binop(*l, *r, "+=", depth), - Expr::SubtractAssign(l, r) => fmt_binop(*l, *r, "-=", depth), - Expr::MultiplyAssign(l, r) => fmt_binop(*l, *r, "*=", depth), - Expr::DivideAssign(l, r) => fmt_binop(*l, *r, "/=", depth), + Expr::Assign(l, r) => fmt_binop(l, r, "=", depth), + Expr::AddAssign(l, r) => fmt_binop(l, r, "+=", depth), + Expr::SubtractAssign(l, r) => fmt_binop(l, r, "-=", depth), + Expr::MultiplyAssign(l, r) => fmt_binop(l, r, "*=", depth), + Expr::DivideAssign(l, r) => fmt_binop(l, r, "/=", depth), Expr::Literal(l) => l.to_string(), Expr::Call(l, r) => { - let mut result = fmt_expr(*l, depth); + let mut result = fmt_expr(l, depth); result.push('('); let len = r.len(); for (i, e) in r.into_iter().enumerate() { @@ -38,17 +38,17 @@ fn fmt_expr(e: Expr, depth: usize) -> String { result } Expr::If(c, t, f) => { - let mut result = format!("if ({}) ({})", fmt_expr(*c, depth), fmt_expr(*t, depth)); + let mut result = format!("if ({}) ({})", fmt_expr(c, depth), fmt_expr(t, depth)); if let Some(f) = f { - let _ = write!(result, " else ({})", fmt_expr(*f, depth)); + let _ = write!(result, " else ({})", fmt_expr(f, depth)); } result } - Expr::Return(l) => format!("return ({})", fmt_expr(*l, depth)), + Expr::Return(l) => format!("return ({})", fmt_expr(l, depth)), Expr::Block(b) => { let mut result = String::new(); let len = b.exprs.len(); - for (i, expr) in b.exprs.into_iter().enumerate() { + for (i, expr) in b.exprs.iter().enumerate() { result.push_str(&" ".repeat(depth)); result.push_str(&fmt_expr(expr, depth + 1)); if depth != 0 || i + 1 != len { @@ -66,23 +66,23 @@ fn fmt_expr(e: Expr, depth: usize) -> String { .map(|e| fmt_expr(e, depth)) .collect::>() .join(", "), - fmt_expr(*e, depth) + fmt_expr(e, depth) ), - Expr::Negate(l) => format!("(-{})", fmt_expr(*l, depth)), - Expr::Not(l) => format!("(!{})", fmt_expr(*l, depth)), - Expr::EqualTo(l, r) => fmt_binop(*l, *r, "==", depth), - Expr::NotEqualTo(l, r) => fmt_binop(*l, *r, "!=", depth), - Expr::And(l, r) => fmt_binop(*l, *r, "&&", depth), - Expr::Or(l, r) => fmt_binop(*l, *r, "||", depth), - Expr::LessThan(l, r) => fmt_binop(*l, *r, "<", depth), - Expr::LessThanOrEqualTo(l, r) => fmt_binop(*l, *r, "<=", depth), - Expr::GreaterThan(l, r) => fmt_binop(*l, *r, ">", depth), - Expr::GreaterThanOrEqualTo(l, r) => fmt_binop(*l, *r, ">=", depth), - Expr::Add(l, r) => fmt_binop(*l, *r, "+", depth), - Expr::Subtract(l, r) => fmt_binop(*l, *r, "-", depth), - Expr::Multiply(l, r) => fmt_binop(*l, *r, "*", depth), - Expr::Divide(l, r) => fmt_binop(*l, *r, "/", depth), - Expr::Exponent(l, r) => fmt_binop(*l, *r, "**", depth), - Expr::Modulo(l, r) => fmt_binop(*l, *r, "%", depth), + Expr::Negate(l) => format!("(-{})", fmt_expr(l, depth)), + Expr::Not(l) => format!("(!{})", fmt_expr(l, depth)), + Expr::EqualTo(l, r) => fmt_binop(l, r, "==", depth), + Expr::NotEqualTo(l, r) => fmt_binop(l, r, "!=", depth), + Expr::And(l, r) => fmt_binop(l, r, "&&", depth), + Expr::Or(l, r) => fmt_binop(l, r, "||", depth), + Expr::LessThan(l, r) => fmt_binop(l, r, "<", depth), + Expr::LessThanOrEqualTo(l, r) => fmt_binop(l, r, "<=", depth), + Expr::GreaterThan(l, r) => fmt_binop(l, r, ">", depth), + Expr::GreaterThanOrEqualTo(l, r) => fmt_binop(l, r, ">=", depth), + Expr::Add(l, r) => fmt_binop(l, r, "+", depth), + Expr::Subtract(l, r) => fmt_binop(l, r, "-", depth), + Expr::Multiply(l, r) => fmt_binop(l, r, "*", depth), + Expr::Divide(l, r) => fmt_binop(l, r, "/", depth), + Expr::Exponent(l, r) => fmt_binop(l, r, "**", depth), + Expr::Modulo(l, r) => fmt_binop(l, r, "%", depth), } }