aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/ast/models.rs
blob: 1cb705de751c5d49db9a87caf61ba383f172dee5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
use std::rc::Rc;

use crate::span::Spanned;

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct LetVar {
    pub name: Spanned<Rc<str>>,
    pub expr: Spanned<Expr>,
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Atom {
    Int(i64),
    Str(Rc<str>),
    Sym(Rc<str>),
    Bool(bool),
    Nil,
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Expr {
    Fn {
        name: Spanned<Rc<str>>,
        args: Vec<Spanned<Rc<str>>>,
        body: Vec<Spanned<Expr>>,
    },
    Const {
        vars: Vec<Spanned<LetVar>>,
    },
    Let {
        vars: Vec<Spanned<LetVar>>,
        body: Vec<Spanned<Expr>>,
    },
    If {
        condition: Spanned<Box<Expr>>,
        then_expr: Spanned<Box<Expr>>,
        else_expr: Option<Spanned<Box<Expr>>>,
    },
    For {
        loop_var: Spanned<Rc<str>>,
        from: Spanned<Box<Expr>>,
        to: Spanned<Box<Expr>>,
        body: Vec<Spanned<Expr>>,
    },
    Set {
        target_var: Spanned<Rc<str>>,
        expr: Spanned<Box<Expr>>,
    },
    Do {
        body: Vec<Spanned<Expr>>,
    },
    Call {
        fn_name: Spanned<Rc<str>>,
        args: Vec<Spanned<Expr>>,
    },
    Atom(Atom),
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Ast(Vec<Spanned<Expr>>);

impl Ast {
    pub fn new(ast: Vec<Spanned<Expr>>) -> Self {
        Self(ast)
    }

    pub fn inner(&self) -> &[Spanned<Expr>] {
        &self.0
    }

    pub fn into_inner(self) -> Vec<Spanned<Expr>> {
        self.0
    }
}