1use ir::*;
2mod node;
3mod stmts;
4mod util;
5use node::*;
6
7pub struct BStar {
8 ir: IR,
9}
10
11impl BStar {
12 pub fn new(ir: IR) -> BStar {
13 BStar { ir }
14 }
15
16 pub fn fmt_var(&mut self, ind: usize) -> Result<Node, BStarError> {
17 let v = &self.ir.variables[ind];
18 Ok(Node::Ident(format!(
19 "{}{:x}",
20 v.name.clone().split_at(1).1,
21 ind,
22 )))
23 }
24
25 pub fn build_fn(&mut self, f: usize) -> Result<Node, BStarError> {
26 let body = self.build_node(&self.ir.funcs[f].body.clone())?;
27 let mut params = Vec::new();
28 for i in 0..self.ir.funcs[f].params.len() {
29 params.push(self.fmt_var(self.ir.funcs[f].params[i])?);
30 }
31 Ok(Node::Tag(
32 "FUNC".to_string(),
33 vec![
34 Node::Ident(self.ir.funcs[f].name.clone()),
35 Node::Tag("ARRAY".to_string(), params),
36 body,
37 ],
38 ))
39 }
40
41 pub fn build(&mut self) -> Result<Vec<Node>, BStarError> {
42 let mut res = Vec::new();
43 res.push(Node::Tag(
44 "IMPORT".to_string(),
45 vec![Node::Ident("bsharplib".to_string())],
46 ));
47 for i in 0..self.ir.funcs.len() {
48 let v = self.build_fn(i)?;
49 res.push(v);
50 }
51 res.push(Node::Tag("@MAIN".to_string(), vec![]));
52 Ok(res)
53 }
54}