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 op_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
40 alt((add_assign_operator, sub_assign_operator, mul_assign_operator, div_assign_operator, exp_assign_operator))(input)
41}
42
43pub fn add_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
45 let (input, _) = whitespace0(input)?;
46 let (input, _) = tag("+=")(input)?;
47 let (input, _) = whitespace0(input)?;
48 Ok((input, OpAssignOp::Add))
49}
50
51pub fn sub_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::Sub))
57}
58
59pub fn mul_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::Mul))
65}
66pub fn div_assign_operator(input: ParseString) -> ParseResult<OpAssignOp> {
68 let (input, _) = whitespace0(input)?;
69 let (input, _) = tag("/=")(input)?;
70 let (input, _) = whitespace0(input)?;
71 Ok((input, OpAssignOp::Div))
72}
73
74pub fn exp_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::Exp))
80}
81
82pub fn variable_define(input: ParseString) -> ParseResult<VariableDefine> {
110 let msg1 = "Expects spaces around operator";
111 let msg2 = "Expects expression";
112 let (input, mutable) = opt(tilde)(input)?;
113 let (input, var) = var(input)?;
114 let (input, _) = labelr!(null(is_not(assign_operator)), skip_nil, msg1)(input)?;
115 let (input, _) = define_operator(input)?;
116 let (input, expression) = label!(expression, msg2)(input)?;
117 let mutable = match mutable {
118 Some(_) => true,
119 None => false,
120 };
121 Ok((input, VariableDefine{mutable, var, expression}))
122}
123
124pub fn variable_assign(input: ParseString) -> ParseResult<VariableAssign> {
126 let msg1 = "Expects spaces around operator";
127 let msg2 = "Expects expression";
128 let (input, target) = slice_ref(input)?;
129 let (input, _) = labelr!(null(is_not(define_operator)), skip_nil, msg1)(input)?;
130 let (input, _) = assign_operator(input)?;
131 let (input, expression) = label!(expression, msg2)(input)?;
132 Ok((input, VariableAssign{target,expression}))
133}
134
135pub fn op_assign(input: ParseString) -> ParseResult<OpAssign> {
137 let msg1 = "Expects spaces around operator";
138 let msg2 = "Expects expression";
139 let (input, target) = slice_ref(input)?;
140 let (input, _) = labelr!(null(is_not(define_operator)), skip_nil, msg1)(input)?;
141 let (input, op) = op_assign_operator(input)?;
142 let (input, expression) = label!(expression, msg2)(input)?;
143 Ok((input, OpAssign{target,op,expression}))
144}
145
146pub fn statement(input: ParseString) -> ParseResult<Statement> {
163 match variable_define(input.clone()) {
164 Ok((input, var_def)) => { return Ok((input, Statement::VariableDefine(var_def))); },
165 _ => (),
167 }
168 match variable_assign(input.clone()) {
169 Ok((input, var_asgn)) => { return Ok((input, Statement::VariableAssign(var_asgn))); },
170 _ => (),
172 }
173 match op_assign(input.clone()) {
174 Ok((input, var_asgn)) => { return Ok((input, Statement::OpAssign(var_asgn))); },
175 _ => (),
177 }
178 match enum_define(input.clone()) {
179 Ok((input, enm_def)) => { return Ok((input, Statement::EnumDefine(enm_def))); },
180 _ => (),
182 }
183 match fsm_declare(input.clone()) {
184 Ok((input, var_def)) => { return Ok((input, Statement::FsmDeclare(var_def))); },
185 _ => (),
187 }
188 match kind_define(input.clone()) {
189 Ok((input, knd_def)) => { return Ok((input, Statement::KindDefine(knd_def))); },
190 Err(err) => { return Err(err); },
191 }
192}
193
194pub fn enum_define(input: ParseString) -> ParseResult<EnumDefine> {
196 let (input, _) = left_angle(input)?;
197 let (input, name) = identifier(input)?;
198 let (input, _) = right_angle(input)?;
199 let (input, _) = define_operator(input)?;
200 let (input, variants) = separated_list1(enum_separator, enum_variant)(input)?;
201 Ok((input, EnumDefine{name, variants}))
202}
203
204pub fn enum_variant(input: ParseString) -> ParseResult<EnumVariant> {
206 let (input, _) = opt(grave)(input)?;
207 let (input, name) = identifier(input)?;
208 let (input, value) = opt(enum_variant_kind)(input)?;
209 Ok((input, EnumVariant{name, value}))
210}
211
212pub fn enum_variant_kind(input: ParseString) -> ParseResult<KindAnnotation> {
214 let (input, _) = left_parenthesis(input)?;
215 let (input, annotation) = kind_annotation(input)?;
216 let (input, _) = right_parenthesis(input)?;
217 Ok((input, annotation))
218}
219
220pub fn kind_define(input: ParseString) -> ParseResult<KindDefine> {
222 let (input, _) = left_angle(input)?;
223 let (input, name) = identifier(input)?;
224 let (input, _) = right_angle(input)?;
225 let (input, _) = define_operator(input)?;
226 let (input, knd) = kind_annotation(input)?;
227 Ok((input, KindDefine{name,kind:knd}))
228}
229
230
231
232