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}