From 2aa9b33418f07b84eadb59bd770f97336ca6809c Mon Sep 17 00:00:00 2001 From: ale Date: Mon, 25 Aug 2025 20:20:43 +0200 Subject: [PATCH] fix parser Signed-off-by: ale --- src/codegen.rs | 17 ++++++++++++----- src/parser.rs | 12 ++++++++++-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/codegen.rs b/src/codegen.rs index 6ae6810..f9af9cd 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -131,8 +131,11 @@ impl CodeGenerator { // Set up parameter tracking self.current_function_params.clear(); self.local_variables.clear(); - // Start local variables after parameters to avoid collision - self.stack_offset = -(function.parameters.len() as i32 * 8); + // Start local variables after all parameters to avoid collision + // Parameters use negative offsets -8, -16, -24, etc. + // Local variables should start after the last parameter + let param_space = (function.parameters.len() as i32) * 8; + self.stack_offset = -param_space - 8; // Start after all parameters self.epilogue_emitted = false; // Function prologue @@ -175,10 +178,14 @@ impl CodeGenerator { self.emit_line(" push rbp"); self.emit_line(" mov rbp, rsp"); - // Reserve space for parameters + ensure 16-byte alignment + // Reserve space for parameters + local variables + ensure 16-byte alignment let stack_space = parameters.len() * 8; - // Always reserve at least 8 bytes to maintain 16-byte alignment after rbp push - let min_space = if stack_space == 0 { 8 } else { stack_space }; + // Reserve more space for local variables (128 bytes should be enough for most functions) + let min_space = if stack_space == 0 { + 128 + } else { + stack_space + 128 + }; let aligned_space = min_space.div_ceil(16) * 16; // Round up to 16-byte boundary self.emit_line(&format!(" sub rsp, {}", aligned_space)); diff --git a/src/parser.rs b/src/parser.rs index 5bfa15b..574c924 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -620,8 +620,16 @@ impl Parser { self.consume(&TokenType::RightParen, "Expected ')' after parameters")?; let body = if self.check(&TokenType::LeftBrace) { - self.advance()?; // Consume the LeftBrace - self.parse_block_statement()? + // Don't advance here, let parse_block_statement handle it + let mut statements = Vec::new(); + self.consume(&TokenType::LeftBrace, "Expected '{' before function body")?; + + while !self.check(&TokenType::RightBrace) && !self.is_at_end() { + statements.push(self.parse_statement()?); + } + + self.consume(&TokenType::RightBrace, "Expected '}' after function body")?; + Statement::Block(statements) } else { self.consume( &TokenType::Semicolon,