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}