From 659f9fbe653e2e6790d6baf3381d89ac3d8a165a Mon Sep 17 00:00:00 2001 From: Wynd Date: Tue, 22 Oct 2024 16:10:04 +0300 Subject: [PATCH] Removed makefile for a simpler sh script and finalized the compiler with loops --- Makefile.toml | 34 ---------------------------------- src/asm_gen.rs | 29 +++++++++++++++++++++++------ src/main.rs | 16 ++++++++++++---- src/tokenizer.rs | 8 ++++++-- test.sh | 12 ++++++++++++ 5 files changed, 53 insertions(+), 46 deletions(-) delete mode 100644 Makefile.toml create mode 100755 test.sh diff --git a/Makefile.toml b/Makefile.toml deleted file mode 100644 index 03ee6ae..0000000 --- a/Makefile.toml +++ /dev/null @@ -1,34 +0,0 @@ -[tasks.compile-bf] -clear = true -private = true -command = "cargo" -args = ["run", "--release", "--", "${@}"] - -[tasks.move] -clear = true -private = true -command = "mv" -args = ["./program.asm", "./asm/program.asm"] -dependencies = ["compile-bf"] - -[tasks.assemble] -private = true -command = "nasm" -args = ["-felf64", "./asm/program.asm"] -dependencies = ["move"] - -[tasks.link] -clear = true -private = true -command = "ld.lld" -args = ["./asm/program.o", "-o", "./asm/program"] -dependencies = ["assemble"] - -[tasks.compile] -clear = true -dependencies = ["link"] - -[tasks.test] -clear = true -command = "./asm/program" -dependencies = ["link"] diff --git a/src/asm_gen.rs b/src/asm_gen.rs index 6fdddc1..ca6b710 100644 --- a/src/asm_gen.rs +++ b/src/asm_gen.rs @@ -1,8 +1,11 @@ +use std::collections::VecDeque; + use crate::tokenizer::{Token, TokenType}; pub fn generate(tokens: Vec) -> String { let mut output = String::new(); + // reserving mem output.push_str( "section .bss\n\ data: resb 65536\n", @@ -15,12 +18,11 @@ pub fn generate(tokens: Vec) -> String { _start:\n", ); - // create the pointer for var + // create the pointer for our data output.push_str("mov rdx, data\n"); - // NOTE: For debugging only - // output.push_str("mov byte[rdx], 48\n"); - + let mut loops = 0; + let mut stack: VecDeque = VecDeque::new(); for token in tokens { match token.r#type { TokenType::Plus(x) => { @@ -57,8 +59,23 @@ pub fn generate(tokens: Vec) -> String { pop rdx\n", ); } - TokenType::BracketOpen => todo!(), - TokenType::BracketClose => todo!(), + TokenType::BracketOpen => { + output.push_str(&format!( + ".loop_{loops}_start:\n\ + cmp byte[rdx], 0\n\ + je .loop_{loops}_end\n" + )); + stack.push_back(loops); + loops += 1; + } + TokenType::BracketClose => { + let current_loop = stack.pop_back().unwrap(); + output.push_str(&format!( + "cmp byte[rdx], 0\n\ + jne .loop_{current_loop}_start\n\ + .loop_{current_loop}_end:\n", + )); + } } } diff --git a/src/main.rs b/src/main.rs index 285a7c8..c8bad90 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,15 +9,23 @@ mod tokenizer; fn main() { let args: Vec = env::args().collect(); - let input = args.get(1).expect("malformed arguments"); + let mode = args.get(1).expect("mode expected"); + let input = args.get(2).expect("malformed arguments"); let program: Vec = load_program(input); let name = args - .get(2) + .get(3) .map(|s| s.to_string()) .unwrap_or_else(|| "program".to_string()); - compiler::compile(program, name); - // interpreter::run(program); + match mode { + x if x == "c" => { + compiler::compile(program, name); + } + x if x == "i" => { + interpreter::run(program); + } + _ => {} + } } fn load_program(input: &str) -> Vec { diff --git a/src/tokenizer.rs b/src/tokenizer.rs index 80028eb..eed8ce3 100644 --- a/src/tokenizer.rs +++ b/src/tokenizer.rs @@ -55,8 +55,12 @@ pub fn tokenize(program: Vec) -> Vec { b',' => { tokens.push(Token::new(TokenType::Input)); } - b'[' => {} - b']' => {} + b'[' => { + tokens.push(Token::new(TokenType::BracketOpen)); + } + b']' => { + tokens.push(Token::new(TokenType::BracketClose)); + } _ => {} } } diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..d3d78f1 --- /dev/null +++ b/test.sh @@ -0,0 +1,12 @@ +#!/bin/bash +( +mode=$1 +program=$2 +cargo run --release -- $mode $program +if [ "$mode" == "c" ]; then + mv ./program.asm ./asm/program.asm \ + && nasm -felf64 ./asm/program.asm \ + && ld.lld ./asm/program.o -o ./asm/program \ + && ./asm/program +fi +)