added ifs with else

This commit is contained in:
MCorange 2023-03-13 23:15:49 +02:00
parent 8f91098792
commit 6ac45cfcb7
4 changed files with 25 additions and 7 deletions

View File

@ -110,13 +110,16 @@ pub fn compile(tokens: Vec<Operator>, args: Args) -> Result<()>{
writeln!(writer, " ; -- IF")?; writeln!(writer, " ; -- IF")?;
writeln!(writer, " pop rax")?; writeln!(writer, " pop rax")?;
writeln!(writer, " test rax, rax")?; writeln!(writer, " test rax, rax")?;
writeln!(writer, " jz addr_{}", token.value)?; writeln!(writer, " jz addr_{}", token.value + 1)?;
ti += 1; ti += 1;
}, },
OpType::Else => { OpType::Else => {
writeln!(writer, " ; -- ELSE")?;
writeln!(writer, " jmp addr_{}", token.value)?;
ti += 1; ti += 1;
}, },
OpType::End => { OpType::End => {
writeln!(writer, " ; -- END")?;
ti += 1; ti += 1;
}, },
} }

View File

@ -51,12 +51,13 @@ pub fn run(tokens: Vec<crate::constants::Operator>) -> Result<(), &'static str>{
OpType::If => { OpType::If => {
let a = stack_pop(&mut stack)?; let a = stack_pop(&mut stack)?;
if a == 0 { if a == 0 {
ti = token.value as usize; ti = (token.value + 1) as usize;
} else {
ti += 1;
} }
ti += 1;
}, },
OpType::Else => { OpType::Else => {
ti += 1; ti = token.value as usize;
}, },
OpType::End => ti += 1 OpType::End => ti += 1

View File

@ -11,6 +11,18 @@ pub fn cross_ref(mut tokens: Vec<Operator>) -> Vec<Operator> {
} }
OpType::End => { OpType::End => {
let block_ip = stack.pop().unwrap();
let mut block_og = &mut tokens[block_ip as usize];
if vec![OpType::If, OpType::Else].contains(&(*block_og).typ) {
(*block_og).value = ip as i32;
tokens[block_ip as usize] = block_og.clone();
} else {
util::logger::pos_error(op.clone().pos,"'end' can only close 'if' blocks");
std::process::exit(1); // idc
}
}
OpType::Else => {
let if_ip = stack.pop().unwrap(); let if_ip = stack.pop().unwrap();
let mut if_og = &mut tokens[if_ip as usize]; let mut if_og = &mut tokens[if_ip as usize];
if !vec![OpType::If].contains(&(*if_og).typ) { if !vec![OpType::If].contains(&(*if_og).typ) {
@ -19,7 +31,7 @@ pub fn cross_ref(mut tokens: Vec<Operator>) -> Vec<Operator> {
} }
(*if_og).value = ip as i32; (*if_og).value = ip as i32;
stack.push(ip as u32);
} }
_ => () _ => ()
} }

View File

@ -1,3 +1,5 @@
35 34 + 692 = if 1 1 = if
21 print 1111 print
else
2222 print
end end