jazz_bytecode/
parser.rs

1use jazz::opcodes::Instruction;
2use super::opcode::{Opcode,Size};
3use super::decode;
4
5#[derive(Clone,Debug)]
6pub struct Parser<'a> {
7    pub code: &'a [u8],
8    pub parsed_code: Vec<Instruction>,
9    pub ip: usize,
10}
11
12
13impl<'a> Parser<'a> {
14    pub fn new(code: &'a [u8]) -> Parser<'a> {
15        Parser {
16            code,
17            parsed_code: vec![],
18            ip: 0,
19        }
20    }
21
22    pub fn read_next(&mut self) -> u8 {
23        if self.ip < self.code.len() {
24            let op = self.code[self.ip].clone();
25            
26            self.ip += 1;
27            op
28        } else {
29            
30            return 0x0;
31        }
32    }
33    pub fn parse(&mut self) -> Vec<Instruction> {
34        let size = *self.code.last().unwrap() as usize;
35        let mut ip = 0;
36        while ip < size {
37            if self.ip >= self.code.len() {
38                break;
39            }
40            self.parse_opcode();
41            ip += 1;
42            
43        }
44
45        return self.parsed_code.clone();
46    }
47
48    pub fn parse_opcode(&mut self) {
49        let op = &self.read_next();
50        println!("{:?}",Opcode::to_string(op.clone()));
51        match op {
52            &Opcode::Move => {
53                let r1 = self.read_next();
54                let r2 = self.read_next();
55                self.parsed_code.push(Instruction::Move(r1 as usize,r2 as usize));
56            }
57
58            &Opcode::LoadI => {
59                
60                let register = self.read_next() as usize;
61
62                let array = {
63                    let mut array = [0u8;Size::Int as usize];
64                    let mut i = 0;
65                    while i < Size::Int {
66                        let idx = self.read_next();
67                        array[i as usize] = idx;
68                        i += 1;
69                    }
70                    array
71                };
72
73                let int = decode!(array;i32);
74                self.parsed_code.push(Instruction::LoadInt(register,int));
75            },
76
77            &Opcode::LoadL => {
78                let register = self.read_next() as usize;
79
80                let array = {
81                    let mut array = [0u8;Size::Long as usize];
82                    for i in 0..Size::Long as usize {
83                        array[i] = self.read_next();
84                    }
85                    array
86                };
87
88                let long = decode!(array;i64);
89                self.parsed_code.push(Instruction::LoadLong(register,long));                
90            }
91            &Opcode::LoadF => {
92                let register = self.read_next() as usize;
93
94                let array = {
95                    let mut array = [0u8;Size::Float as usize];
96                    for i in 0..Size::Float as usize {
97                        array[i] = self.read_next();
98                    }
99                    array
100                };
101
102                let float = decode!(array;f32);
103                self.parsed_code.push(Instruction::LoadFloat(register,float));
104            }
105            &Opcode::Label => {
106                let label_id = self.read_next() as usize;
107
108                self.parsed_code.push(Instruction::Label(label_id));
109            }
110
111            &Opcode::GotoF => {
112                let reg = self.read_next();
113                let lbl_id = self.read_next();
114
115                self.parsed_code.push(Instruction::GotoF(reg as usize,lbl_id as usize));
116            }
117
118            &Opcode::Goto => {
119                let lbl_id = self.read_next();
120
121                self.parsed_code.push(Instruction::Goto(lbl_id as usize));
122            }
123
124            _ => {}
125        }
126    }
127}