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
52#[derive(Clone, Debug, PartialEq)]
53pub struct FuncDecl {
54    pub name: Var,
55    pub polys: Vec<Var>,
56    pub pars: Vec<(Var, Type)>,
57    pub res: Type,
58    pub body: Expr,
59    pub span: Span,
60}
61
62#[derive(Clone, Debug, PartialEq)]
63pub enum Pattern {
64    Lit {
65        lit: LitVal,
66        span: Span,
67    },
68    Var {
69        var: Var,
70        span: Span,
71    },
72    Cons {
73        cons: Var,
74        flds: Vec<Pattern>,
75        span: Span,
76    },
77    Tuple {
78        flds: Vec<Pattern>,
79        span: Span,
80    },
81}
82
83#[derive(Clone, Debug, PartialEq)]
84pub enum Expr {
85    Lit {
86        lit: LitVal,
87        span: Span,
88    },
89    Var {
90        var: Var,
91        span: Span,
92    },
93    Prim {
94        prim: Prim,
95        args: Vec<Expr>,
96        span: Span,
97    },
98    Cons {
99        cons: Var,
100        flds: Vec<Expr>,
101        span: Span,
102    },
103    Tuple {
104        flds: Vec<Expr>,
105        span: Span,
106    },
107    Match {
108        expr: Box<Expr>,
109        brchs: Vec<(Pattern, Expr)>,
110        span: Span,
111    },
112    Let {
113        patn: Pattern,
114        expr: Box<Expr>,
115        cont: Box<Expr>,
116        span: Span,
117    },
118    App {
119        func: Var,
120        args: Vec<Expr>,
121        span: Span,
122    },
123    Ifte {
124        cond: Box<Expr>,
125        then: Box<Expr>,
126        els: Box<Expr>,
127        span: Span,
128    },
129    Cond {
130        brchs: Vec<(Expr, Expr)>,
131        span: Span,
132    },
133    Alter {
134        brchs: Vec<Expr>,
135        span: Span,
136    },
137    Fresh {
138        vars: Vec<Var>,
139        cont: Box<Expr>,
140        span: Span,
141    },
142    Guard {
143        lhs: Box<Expr>,
144        rhs: Option<Box<Expr>>,
145        cont: Box<Expr>,
146        span: Span,
147    },
148    Undefined {
149        span: Span,
150    },
151}
152
153#[derive(Clone, Debug, PartialEq)]
154pub struct QueryDecl {
155    pub entry: Var,
156    pub params: Vec<(QueryParam, Span)>,
157    pub span: Span,
158}
159
160#[derive(Clone, Debug, PartialEq)]
161pub enum QueryParam {
162    DepthStep(usize),
163    DepthLimit(usize),
164    AnswerLimit(usize),
165    AnswerPause(bool),
166}