bsharp_bstar/
lib.rs

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}