Skip to main content

prune_lang/syntax/
ast.rs

1use super::*;
2
3#[derive(Clone, Debug, PartialEq)]
4pub struct Program {
5    pub datas: Vec<DataDecl>,
6    pub funcs: Vec<FuncDecl>,
7    pub querys: Vec<QueryDecl>,
8}
9
10#[derive(Clone, Debug, PartialEq, Eq)]
11pub struct Var {
12    pub ident: Ident,
13    pub span: Span,
14}
15
16#[derive(Clone, Debug, PartialEq)]
17pub struct DataDecl {
18    pub name: Var,
19    pub polys: Vec<Var>,
20    pub cons: Vec<Constructor>,
21    pub span: Span,
22}
23
24#[derive(Clone, Debug, PartialEq)]
25pub struct Constructor {
26    pub name: Var,
27    pub flds: Vec<Type>,
28    pub span: Span,
29}
30
31#[derive(Clone, Debug, PartialEq)]
32pub enum Type {
33    Lit {
34        lit: LitType,
35        span: Span,
36    },
37    Var {
38        var: Var,
39        span: Span,
40    },
41    Cons {
42        cons: Var,
43        flds: Vec<Type>,
44        span: Span,
45    },
46    Tuple {
47        flds: Vec<Type>,
48        span: Span,
49    },
50}
51
52impl Type {
53    pub fn get_span(&self) -> Span {
54        match self {
55            Type::Lit { span, .. } => span.clone(),
56            Type::Var { span, .. } => span.clone(),
57            Type::Cons { span, .. } => span.clone(),
58            Type::Tuple { span, .. } => span.clone(),
59        }
60    }
61}
62
63#[derive(Clone, Debug, PartialEq)]
64pub struct FuncDecl {
65    pub name: Var,
66    pub polys: Vec<Var>,
67    pub pars: Vec<(Var, Type)>,
68    pub res: Type,
69    pub body: Expr,
70    pub span: Span,
71}
72
73#[derive(Clone, Debug, PartialEq)]
74pub enum Pattern {
75    Lit {
76        lit: LitVal,
77        span: Span,
78    },
79    Var {
80        var: Var,
81        span: Span,
82    },
83    Cons {
84        cons: Var,
85        flds: Vec<Pattern>,
86        span: Span,
87    },
88    Tuple {
89        flds: Vec<Pattern>,
90        span: Span,
91    },
92}
93
94impl Pattern {
95    pub fn get_span(&self) -> Span {
96        match self {
97            Pattern::Lit { span, .. } => span.clone(),
98            Pattern::Var { span, .. } => span.clone(),
99            Pattern::Cons { span, .. } => span.clone(),
100            Pattern::Tuple { span, .. } => span.clone(),
101        }
102    }
103}
104
105#[derive(Clone, Debug, PartialEq)]
106pub enum Expr {
107    Lit {
108        lit: LitVal,
109        span: Span,
110    },
111    Var {
112        var: Var,
113        span: Span,
114    },
115    Prim {
116        prim: Prim,
117        args: Vec<Expr>,
118        span: Span,
119    },
120    Cons {
121        cons: Var,
122        flds: Vec<Expr>,
123        span: Span,
124    },
125    Tuple {
126        flds: Vec<Expr>,
127        span: Span,
128    },
129    Match {
130        expr: Box<Expr>,
131        brchs: Vec<(Pattern, Expr)>,
132        span: Span,
133    },
134    Let {
135        patn: Pattern,
136        expr: Box<Expr>,
137        cont: Box<Expr>,
138        span: Span,
139    },
140    App {
141        func: Var,
142        args: Vec<Expr>,
143        span: Span,
144    },
145    Ifte {
146        cond: Box<Expr>,
147        then: Box<Expr>,
148        els: Box<Expr>,
149        span: Span,
150    },
151    Cond {
152        brchs: Vec<(Expr, Expr)>,
153        span: Span,
154    },
155    Alter {
156        brchs: Vec<Expr>,
157        span: Span,
158    },
159    Fresh {
160        vars: Vec<Var>,
161        cont: Box<Expr>,
162        span: Span,
163    },
164    Guard {
165        lhs: Box<Expr>,
166        rhs: Option<Box<Expr>>,
167        cont: Box<Expr>,
168        span: Span,
169    },
170    Undefined {
171        span: Span,
172    },
173}
174
175impl Expr {
176    pub fn get_span(&self) -> Span {
177        match self {
178            Expr::Lit { span, .. } => span.clone(),
179            Expr::Var { span, .. } => span.clone(),
180            Expr::Prim { span, .. } => span.clone(),
181            Expr::Cons { span, .. } => span.clone(),
182            Expr::Tuple { span, .. } => span.clone(),
183            Expr::Match { span, .. } => span.clone(),
184            Expr::Let { span, .. } => span.clone(),
185            Expr::App { span, .. } => span.clone(),
186            Expr::Ifte { span, .. } => span.clone(),
187            Expr::Cond { span, .. } => span.clone(),
188            Expr::Alter { span, .. } => span.clone(),
189            Expr::Fresh { span, .. } => span.clone(),
190            Expr::Guard { span, .. } => span.clone(),
191            Expr::Undefined { span, .. } => span.clone(),
192        }
193    }
194}
195
196#[derive(Clone, Debug, PartialEq)]
197pub struct QueryDecl {
198    pub entry: Var,
199    pub params: Vec<(QueryParam, Span)>,
200    pub span: Span,
201}
202
203#[derive(Clone, Debug, PartialEq)]
204pub enum QueryParam {
205    DepthStep(usize),
206    DepthLimit(usize),
207    AnswerLimit(usize),
208    AnswerPause(bool),
209}