64 lines
1.4 KiB
Rust
64 lines
1.4 KiB
Rust
|
use crate::tokenizer::{Token, TokenType};
|
||
|
|
||
|
pub fn generate(tokens: Vec<Token>) -> 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
|
||
|
}
|