diff --git a/src/codegen/fasm.rs b/src/codegen/fasm.rs index 05ca253..87a8d17 100644 --- a/src/codegen/fasm.rs +++ b/src/codegen/fasm.rs @@ -8,19 +8,12 @@ macro_rules! fasm_codegen { fasm_codegen($exprs, true) }; - (fun: $exprs:expr) => { + (function: $exprs:expr) => { fasm_codegen($exprs, false) } } -pub fn temp(counter: u64) -> String { - format!("tmp{:?}", counter) -} - pub fn fasm_codegen(exprs: &Vec, not_a_function: bool) -> String { - // A counter for how many temporary variables have been created. This is used to create new ones. The new ones will be called tmp1, tmp2, etc. - let mut tmp_counter: u64 = 0; - // Define asm_func, used for functions. let mut asm_func = String::new(); // Define asm_data, used for variables. @@ -30,7 +23,7 @@ pub fn fasm_codegen(exprs: &Vec, not_a_function: bool) -> String { macro_rules! unwrap { ($item:expr) => { - asm_start.push_str(fasm_codegen!(fun: &vec![*$item.as_ref()]).as_str());- + asm_start.push_str(fasm_codegen!(fun: &vec![*$item.as_ref()]).as_str()); } } @@ -166,7 +159,6 @@ pub fn fasm_codegen(exprs: &Vec, not_a_function: bool) -> String { Expr::Breakpoint => { // Write the interrupt for a debugger breakpoint. asm_start.push_str("\tint3\n"); - asm_start.push_str("\txor rax, rax\n"); }, // Return something from a function. @@ -174,8 +166,7 @@ pub fn fasm_codegen(exprs: &Vec, not_a_function: bool) -> String { // Do the operation that should later be returned. asm_start.push_str(fasm_codegen!(fun: &e).as_str()); // Move the return value to rbp + 8. - asm_start.push_str("mov [rbp + 8], rax"); - // 8(%rbp) ← return_value + // [rbp + 8] ← return_value }, // A function defenition. @@ -183,7 +174,7 @@ pub fn fasm_codegen(exprs: &Vec, not_a_function: bool) -> String { // In x86-64 assembly, a function is defined as :. Push this to the `asm_func`. asm_func.push_str(format!("{}:\n", e.name).as_str()); // Call the function itself specifying that you are defining a function, and push the returned value to `asm_func`. - asm_func.push_str(fasm_codegen!(fun: &e.contents).as_str()); + asm_func.push_str(fasm_codegen!(function: &e.contents).as_str()); // Use the ret instruction to return from the procedure. asm_func.push_str("\tret\n"); }, @@ -213,15 +204,13 @@ pub fn fasm_codegen(exprs: &Vec, not_a_function: bool) -> String { asm_func.push_str("\tret\n"); } - _ => unsafe { // Write some data I randomly typed to your memory because don't going around playing with something that I haven't implemented yet. let mut ptr = 0x00 as *mut f64; ::std::ptr::write(ptr, 124010240120401240.12410240124120401240); }, } - - + } diff --git a/src/parse/ast.rs b/src/parse/ast.rs index c792afc..1cc0379 100644 --- a/src/parse/ast.rs +++ b/src/parse/ast.rs @@ -1,5 +1,3 @@ -use std::rc::Rc; - #[derive(Debug)] pub enum Expr<'a> { MathExpr(Math<'a>), @@ -80,11 +78,24 @@ pub struct ParamReference { // CONDITIONS #[derive(Debug)] +<<<<<<< HEAD pub struct IfCondition<'a> { pub left: Expr<'a>, pub right: Expr<'a>, pub cond: COND_OP, pub action: Vec> +======= +pub struct IfStatement<'a> { + pub condition: Condition<'a>, + pub if_true: Vec>, +} + +#[derive(Debug)] +pub struct Condition<'a> { + pub left: Value<'a>, + pub right: Value<'a>, + pub between: COND_OP, +>>>>>>> parent of 2f942d3 (Added if statements, and made `Expr::Return` work.) } #[derive(Debug)]