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}