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, cmmnt) = alt((comment_singleline, comment_multiline))(input)?;
16 Ok((input, cmmnt))
17}
18
19pub fn comment_singleline(input: ParseString) -> ParseResult<Comment> {
21 let (input, _) = whitespace0(input)?;
22 let (input, _) = comment_sigil(input)?;
23 let (input, mut text) = many1(text)(input)?;
24 Ok((input, Comment{text: Token::merge_tokens(&mut text).unwrap()}))
25}
26
27pub fn comment_multiline(input: ParseString) -> ParseResult<Comment> {
29 let (input, _) = whitespace0(input)?;
30 let (input, _) = tag("/*")(input)?;
31 let (input, text) = many1(nom_tuple((is_not(tag("*/")),alt((text,whitespace)))))(input)?;
32 let mut text = text.iter().map(|(_,a)| a).cloned().collect::<Vec<Token>>();
33 let (input, _) = tag("*/")(input)?;
34 let (input, _) = whitespace0(input)?;
35 Ok((input, Comment{text: Token::merge_tokens(&mut text).unwrap()}))
36}
37
38pub fn assign_operator(input: ParseString) -> ParseResult<()> {
40 let (input, _) = whitespace0(input)?;
41 let (input, _) = tag("=")(input)?;
42 let (input, _) = whitespace0(input)?;
43 Ok((input, ()))
44}
45
46pub fn op_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
48 alt((add_assign_operator, sub_assign_operator, mul_assign_operator, div_assign_operator, exp_assign_operator))(input)
49}
50
51pub fn add_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
53 let (input, _) = whitespace0(input)?;
54 let (input, _) = tag("+=")(input)?;
55 let (input, _) = whitespace0(input)?;
56 Ok((input, OpAssignOp::Add))
57}
58
59pub fn sub_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
61 let (input, _) = whitespace0(input)?;
62 let (input, _) = tag("-=")(input)?;
63 let (input, _) = whitespace0(input)?;
64 Ok((input, OpAssignOp::Sub))
65}
66
67pub fn mul_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
69 let (input, _) = whitespace0(input)?;
70 let (input, _) = tag("*=")(input)?;
71 let (input, _) = whitespace0(input)?;
72 Ok((input, OpAssignOp::Mul))
73}
74pub fn div_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
76 let (input, _) = whitespace0(input)?;
77 let (input, _) = tag("/=")(input)?;
78 let (input, _) = whitespace0(input)?;
79 Ok((input, OpAssignOp::Div))
80}
81
82pub fn exp_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
84 let (input, _) = whitespace0(input)?;
85 let (input, _) = tag("^=")(input)?;
86 let (input, _) = whitespace0(input)?;
87 Ok((input, OpAssignOp::Exp))
88}
89
90pub fn variable_define(input: ParseString) -> ParseResult<VariableDefine> {
118 let msg1 = "Expects spaces around operator";
119 let msg2 = "Expects expression";
120 let (input, mutable) = opt(tilde)(input)?;
121 let (input, var) = var(input)?;
122 let (input, _) = labelr!(null(is_not(assign_operator)), skip_nil, msg1)(input)?;
123 let (input, _) = define_operator(input)?;
124 let (input, expression) = label!(expression, msg2)(input)?;
125 let mutable = match mutable {
126 Some(_) => true,
127 None => false,
128 };
129 Ok((input, VariableDefine{mutable, var, expression}))
130}
131
132pub fn variable_assign(input: ParseString) -> ParseResult<VariableAssign> {
134 let msg1 = "Expects spaces around operator";
135 let msg2 = "Expects expression";
136 let (input, target) = slice_ref(input)?;
137 let (input, _) = labelr!(null(is_not(define_operator)), skip_nil, msg1)(input)?;
138 let (input, _) = assign_operator(input)?;
139 let (input, expression) = label!(expression, msg2)(input)?;
140 Ok((input, VariableAssign{target,expression}))
141}
142
143pub fn op_assign(input: ParseString) -> ParseResult<OpAssign> {
145 let msg1 = "Expects spaces around operator";
146 let msg2 = "Expects expression";
147 let (input, target) = slice_ref(input)?;
148 let (input, _) = labelr!(null(is_not(define_operator)), skip_nil, msg1)(input)?;
149 let (input, op) = op_assign_operator(input)?;
150 let (input, expression) = label!(expression, msg2)(input)?;
151 Ok((input, OpAssign{target,op,expression}))
152}
153
154pub fn statement(input: ParseString) -> ParseResult<Statement> {
171 match variable_define(input.clone()) {
172 Ok((input, var_def)) => { return Ok((input, Statement::VariableDefine(var_def))); },
173 _ => (),
175 }
176 match variable_assign(input.clone()) {
177 Ok((input, var_asgn)) => { return Ok((input, Statement::VariableAssign(var_asgn))); },
178 _ => (),
180 }
181 match op_assign(input.clone()) {
182 Ok((input, var_asgn)) => { return Ok((input, Statement::OpAssign(var_asgn))); },
183 _ => (),
185 }
186 match enum_define(input.clone()) {
187 Ok((input, enm_def)) => { return Ok((input, Statement::EnumDefine(enm_def))); },
188 _ => (),
190 }
191 match fsm_declare(input.clone()) {
192 Ok((input, var_def)) => { return Ok((input, Statement::FsmDeclare(var_def))); },
193 _ => (),
195 }
196 match kind_define(input.clone()) {
197 Ok((input, knd_def)) => { return Ok((input, Statement::KindDefine(knd_def))); },
198 Err(err) => { return Err(err); },
199 }
200}
201
202pub fn enum_define(input: ParseString) -> ParseResult<EnumDefine> {
204 let (input, _) = left_angle(input)?;
205 let (input, name) = identifier(input)?;
206 let (input, _) = right_angle(input)?;
207 let (input, _) = define_operator(input)?;
208 let (input, variants) = separated_list1(enum_separator, enum_variant)(input)?;
209 Ok((input, EnumDefine{name, variants}))
210}
211
212pub fn enum_variant(input: ParseString) -> ParseResult<EnumVariant> {
214 let (input, _) = opt(grave)(input)?;
215 let (input, name) = identifier(input)?;
216 let (input, value) = opt(enum_variant_kind)(input)?;
217 Ok((input, EnumVariant{name, value}))
218}
219
220pub fn enum_variant_kind(input: ParseString) -> ParseResult<KindAnnotation> {
222 let (input, _) = left_parenthesis(input)?;
223 let (input, annotation) = kind_annotation(input)?;
224 let (input, _) = right_parenthesis(input)?;
225 Ok((input, annotation))
226}
227
228pub fn kind_define(input: ParseString) -> ParseResult<KindDefine> {
230 let (input, _) = left_angle(input)?;
231 let (input, name) = identifier(input)?;
232 let (input, _) = right_angle(input)?;
233 let (input, _) = define_operator(input)?;
234 let (input, knd) = kind_annotation(input)?;
235 Ok((input, KindDefine{name,kind:knd}))
236}
237
238
239
240