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)]
11pub enum Declaration {
12    Data(DataDecl),
13    Func(FuncDecl),
14    Query(QueryDecl),
15}
16
17#[derive(Clone, Debug, PartialEq, Eq)]
18pub struct Var {
19    pub ident: Ident,
20    pub span: Span,
21}
22
23#[derive(Clone, Debug, PartialEq)]
24pub struct DataDecl {
25    pub name: Var,
26    pub polys: Vec<Var>,
27    pub cons: Vec<Constructor>,
28    pub span: Span,
29}
30
31#[derive(Clone, Debug, PartialEq)]
32pub struct Constructor {
33    pub name: Var,
34    pub flds: Vec<Type>,
35    pub span: Span,
36}
37
38#[derive(Clone, Debug, PartialEq)]
39pub enum Type {
40    Lit {
41        lit: LitType,
42        span: Span,
43    },
44    Var {
45        var: Var,
46        span: Span,
47    },
48    Cons {
49        cons: Var,
50        flds: Vec<Type>,
51        span: Span,
52    },
53    Tuple {
54        flds: Vec<Type>,
55        span: Span,
56    },
57}
58
59#[derive(Clone, Debug, PartialEq)]
60pub struct FuncDecl {
61    pub name: Var,
62    pub polys: Vec<Var>,
63    pub pars: Vec<(Var, Type)>,
64    pub res: Type,
65    pub body: Expr,
66    pub span: Span,
67}
68
69#[derive(Clone, Debug, PartialEq)]
70pub enum Pattern {
71    Lit {
72        lit: LitVal,
73        span: Span,
74    },
75    Var {
76        var: Var,
77        span: Span,
78    },
79    Cons {
80        cons: Var,
81        flds: Vec<Pattern>,
82        span: Span,
83    },
84    Tuple {
85        flds: Vec<Pattern>,
86        span: Span,
87    },
88}
89
90#[derive(Clone, Debug, PartialEq)]
91pub enum Expr {
92    Lit {
93        lit: LitVal,
94        span: Span,
95    },
96    Var {
97        var: Var,
98        span: Span,
99    },
100    Prim {
101        prim: Prim,
102        args: Vec<Expr>,
103        span: Span,
104    },
105    Cons {
106        cons: Var,
107        flds: Vec<Expr>,
108        span: Span,
109    },
110    Tuple {
111        flds: Vec<Expr>,
112        span: Span,
113    },
114    Match {
115        expr: Box<Expr>,
116        brchs: Vec<(Pattern, Expr)>,
117        span: Span,
118    },
119    Let {
120        patn: Pattern,
121        expr: Box<Expr>,
122        cont: Box<Expr>,
123        span: Span,
124    },
125    App {
126        func: Var,
127        args: Vec<Expr>,
128        span: Span,
129    },
130    Ifte {
131        cond: Box<Expr>,
132        then: Box<Expr>,
133        els: Box<Expr>,
134        span: Span,
135    },
136    Cond {
137        brchs: Vec<(Expr, Expr)>,
138        span: Span,
139    },
140    Alter {
141        brchs: Vec<Expr>,
142        span: Span,
143    },
144    Fresh {
145        vars: Vec<Var>,
146        cont: Box<Expr>,
147        span: Span,
148    },
149    Guard {
150        lhs: Box<Expr>,
151        rhs: Option<Box<Expr>>,
152        cont: Box<Expr>,
153        span: Span,
154    },
155    Undefined {
156        span: Span,
157    },
158}
159
160#[derive(Clone, Debug, PartialEq)]
161pub struct QueryDecl {
162    pub entry: Var,
163    pub params: Vec<(QueryParam, Span)>,
164    pub span: Span,
165}
166
167#[derive(Clone, Debug, PartialEq)]
168pub enum QueryParam {
169    DepthStep(usize),
170    DepthLimit(usize),
171    AnswerLimit(usize),
172    AnswerPause(bool),
173}