1#[macro_use]
2use crate::*;
3use nom::sequence::tuple as nom_tuple;
4
5pub fn comment_sigil(input: ParseString) -> ParseResult<()> {
9 let (input, _) = alt((tag("--"),tag("//")))(input)?;
10 Ok((input, ()))
11}
12
13pub fn comment(input: ParseString) -> ParseResult<Comment> {
15 let (input, _) = many0(space_tab)(input)?;
16 let (input, _) = comment_sigil(input)?;
17 let (input, p) = paragraph(input)?;
18 Ok((input, Comment{paragraph: p}))
19}
20
21pub fn op_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
23 alt((add_assign_operator, sub_assign_operator, mul_assign_operator, div_assign_operator, exp_assign_operator))(input)
24}
25
26pub fn add_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
28 let (input, _) = whitespace0(input)?;
29 let (input, _) = tag("+=")(input)?;
30 let (input, _) = whitespace0(input)?;
31 Ok((input, OpAssignOp::Add))
32}
33
34pub fn sub_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
36 let (input, _) = whitespace0(input)?;
37 let (input, _) = tag("-=")(input)?;
38 let (input, _) = whitespace0(input)?;
39 Ok((input, OpAssignOp::Sub))
40}
41
42pub fn mul_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
44 let (input, _) = whitespace0(input)?;
45 let (input, _) = tag("*=")(input)?;
46 let (input, _) = whitespace0(input)?;
47 Ok((input, OpAssignOp::Mul))
48}
49pub fn div_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
51 let (input, _) = whitespace0(input)?;
52 let (input, _) = tag("/=")(input)?;
53 let (input, _) = whitespace0(input)?;
54 Ok((input, OpAssignOp::Div))
55}
56
57pub fn exp_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
59 let (input, _) = whitespace0(input)?;
60 let (input, _) = tag("^=")(input)?;
61 let (input, _) = whitespace0(input)?;
62 Ok((input, OpAssignOp::Exp))
63}
64
65pub fn variable_define(input: ParseString) -> ParseResult<VariableDefine> {
93 let msg1 = "Expects spaces around operator";
94 let msg2 = "Expects expression";
95 let (input, mutable) = opt(tilde)(input)?;
96 let (input, var) = var(input)?;
97 let (input, _) = labelr!(null(is_not(assign_operator)), skip_nil, msg1)(input)?;
98 let (input, _) = define_operator(input)?;
99 let (input, expression) = label!(expression, msg2)(input)?;
100 let mutable = match mutable {
101 Some(_) => true,
102 None => false,
103 };
104 Ok((input, VariableDefine{mutable, var, expression}))
105}
106
107pub fn variable_assign(input: ParseString) -> ParseResult<VariableAssign> {
109 let msg1 = "Expects spaces around operator";
110 let msg2 = "Expects expression";
111 let (input, target) = slice_ref(input)?;
112 let (input, _) = labelr!(null(is_not(define_operator)), skip_nil, msg1)(input)?;
113 let (input, _) = assign_operator(input)?;
114 let (input, expression) = label!(expression, msg2)(input)?;
115 Ok((input, VariableAssign{target,expression}))
116}
117
118pub fn op_assign(input: ParseString) -> ParseResult<OpAssign> {
120 let msg1 = "Expects spaces around operator";
121 let msg2 = "Expects expression";
122 let (input, target) = slice_ref(input)?;
123 let (input, _) = labelr!(null(is_not(define_operator)), skip_nil, msg1)(input)?;
124 let (input, op) = op_assign_operator(input)?;
125 let (input, expression) = label!(expression, msg2)(input)?;
126 Ok((input, OpAssign{target,op,expression}))
127}
128
129fn tuple_destructure(input: ParseString) -> ParseResult<TupleDestructure> {
147 let (input, _) = left_parenthesis(input)?;
148 let (input, vars) = separated_list1(comma, identifier)(input)?;
149 let (input, _) = right_parenthesis(input)?;
150 let (input, _) = define_operator(input)?;
151 let (input, expression) = expression(input)?;
152 Ok((input, TupleDestructure{vars, expression}))
153}
154
155pub fn statement(input: ParseString) -> ParseResult<Statement> {
157 match variable_define(input.clone()) {
158 Ok((input, var_def)) => { return Ok((input, Statement::VariableDefine(var_def))); },
159 _ => (),
161 }
162 match variable_assign(input.clone()) {
163 Ok((input, var_asgn)) => { return Ok((input, Statement::VariableAssign(var_asgn))); },
164 _ => (),
166 }
167 match op_assign(input.clone()) {
168 Ok((input, var_asgn)) => { return Ok((input, Statement::OpAssign(var_asgn))); },
169 _ => (),
171 }
172 match enum_define(input.clone()) {
173 Ok((input, enm_def)) => { return Ok((input, Statement::EnumDefine(enm_def))); },
174 _ => (),
176 }
177 match tuple_destructure(input.clone()) {
178 Ok((input, tpl_dstr)) => { return Ok((input, Statement::TupleDestructure(tpl_dstr))); },
179 _ => (),
181 }
182 match kind_define(input.clone()) {
188 Ok((input, knd_def)) => { return Ok((input, Statement::KindDefine(knd_def))); },
189 Err(err) => { return Err(err); },
190 }
191}
192
193pub fn enum_define(input: ParseString) -> ParseResult<EnumDefine> {
195 let (input, _) = left_angle(input)?;
196 let (input, name) = identifier(input)?;
197 let (input, _) = right_angle(input)?;
198 let (input, _) = define_operator(input)?;
199 let (input, variants) = separated_list1(enum_separator, enum_variant)(input)?;
200 Ok((input, EnumDefine{name, variants}))
201}
202
203pub fn enum_variant(input: ParseString) -> ParseResult<EnumVariant> {
205 let (input, _) = opt(grave)(input)?;
206 let (input, name) = identifier(input)?;
207 let (input, value) = opt(enum_variant_kind)(input)?;
208 Ok((input, EnumVariant{name, value}))
209}
210
211pub fn enum_variant_kind(input: ParseString) -> ParseResult<KindAnnotation> {
213 let (input, _) = left_parenthesis(input)?;
214 let (input, annotation) = kind_annotation(input)?;
215 let (input, _) = right_parenthesis(input)?;
216 Ok((input, annotation))
217}
218
219pub fn kind_define(input: ParseString) -> ParseResult<KindDefine> {
221 let (input, _) = left_angle(input)?;
222 let (input, name) = identifier(input)?;
223 let (input, _) = right_angle(input)?;
224 let (input, _) = define_operator(input)?;
225 let (input, knd) = kind_annotation(input)?;
226 Ok((input, KindDefine{name,kind:knd}))
227}
228
229
230
231