#[macro_use] extern crate log; use simple_logger::SimpleLogger; use crsn::asm::data::literal::Addr; use crsn::runtime::program::Program; use crsn::runtime::run_thread::{RunThread, ThreadToken}; use crsn_arith::ArithOpParser; fn main() { SimpleLogger::new().init().unwrap(); // ;(dec r0 (z? (ret))) /*let program = " ( (main (ld r0 2) (:again) (dec r0) (jif nz :again) (fault \"that's it\") ) ) ";*/ /* let program = " ( (main (ld r0 2) (call add2x r0 15) (ld r0 res0) (fault \"that's it\") ) (add2x (ld r0 arg0) (ld r1 arg1) (add r0 r1) (add r0 r1) (ret r0) ) ) ";*/ let program = " ( (main (j :lbl) (ld _ arg0) (fault) (:lbl) (call fibo 5) (ld r0 res0) ) (fibo (cmp arg0 2 (eq? (ret 2))) (ld r0 arg0) (dec r0) (call fibo r0) (ld r0 arg0) (mul r0 res0) (ret r0) ) ) "; let parsers = vec![ ArithOpParser::new() ]; let parsed = crsn::asm::assemble(program, parsers.as_slice()).unwrap(); debug!("---"); for op in &parsed.ops { debug!("{:?}", op); } debug!("---"); let thread = RunThread::new(ThreadToken(0), parsed, Addr(0), &[]); thread.start().join().unwrap(); }