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}