use crate::tokenizer::{Token, TokenType}; pub fn generate(tokens: Vec) -> String { let mut output = String::new(); output.push_str( "section .bss\n\ result: resb 65536\n", ); // global start label output.push_str( "global _start\n\ section .text\n\ _start:\n", ); // NOTE: For debugging only output.push_str("mov dl, 48\n"); for token in tokens { match token.r#type { TokenType::Plus(x) => { output.push_str(&format!( "add dl, {x}\n\ mov byte [result], dl\n" )); } TokenType::Minus(x) => { output.push_str(&format!( "sub dl, {x}\n\ mov byte [result], dl\n" )); } TokenType::MoveRight(_) => todo!(), TokenType::MoveLeft(_) => todo!(), TokenType::Output => { output.push_str( "push rdx\n\ mov byte [result + 1], 10\n\ mov rax, 1\n\ mov rdi, 1\n\ mov rsi, result\n\ mov rdx, 4\n\ syscall\n\ pop rdx\n", ); } TokenType::Input => todo!(), TokenType::BracketOpen => todo!(), TokenType::BracketClose => todo!(), } } // exit syscall output.push_str( "mov rax, 60\n\ mov rdi, 0\n\ syscall\n", ); output }