1#[macro_use]
2use crate::*;
3use nom::{
4 multi::separated_list0,
5 sequence::tuple as nom_tuple,
6};
7
8pub fn guard_operator(input: ParseString) -> ParseResult<()> {
12 let (input, _) = whitespace0(input)?;
13 let (input, _) = alt((tag("|"),tag("│"),tag("├"),tag("└")))(input)?;
14 let (input, _) = whitespace0(input)?;
15 Ok((input, ()))
16}
17
18pub fn fsm_implementation(input: ParseString) -> ParseResult<FsmImplementation> {
20 let (input, _) = hashtag(input)?;
21 let (input, name) = identifier(input)?;
22 let (input, _) = left_parenthesis(input)?;
23 let (input, input_vars) = separated_list0(list_separator, identifier)(input)?;
24 let (input, _) = right_parenthesis(input)?;
25 let (input, _) = transition_operator(input)?;
26 let (input, start) = fsm_pattern(input)?;
27 let (input, _) = whitespace0(input)?;
28 let (input, arms) = many1(fsm_arm)(input)?;
29 let (input, _) = period(input)?;
30 Ok((input, FsmImplementation{name,input: input_vars,start,arms}))
31}
32
33pub fn fsm_arm(input: ParseString) -> ParseResult<FsmArm> {
35 let (input, _) = many0(comment)(input)?;
36 let (input, arm) = alt((fsm_guard_arm,fsm_transition))(input)?;
37 let (input, _) = whitespace0(input)?;
38 Ok((input, arm))
39}
40
41pub fn fsm_guard_arm(input: ParseString) -> ParseResult<FsmArm> {
43 let (input, _) = many0(comment)(input)?;
44 let (input, start) = fsm_pattern(input)?;
45 let (input, grds) = many1(fsm_guard)(input)?;
46 Ok((input, FsmArm::Guard(start, grds)))
47}
48
49pub fn fsm_guard(input: ParseString) -> ParseResult<Guard> {
51 let (input, _) = guard_operator(input)?;
52 let (input, cnd) = fsm_pattern(input)?;
53 let (input, trns) = many1(alt((
54 fsm_statement_transition,
55 fsm_state_transition,
56 fsm_output,
57 fsm_async_transition,
58 fsm_block_transition)))(input)?;
59 Ok((input, Guard{condition: cnd, transitions: trns}))
60}
61
62pub fn fsm_transition(input: ParseString) -> ParseResult<FsmArm> {
64 let (input, _) = many0(comment)(input)?;
65 let (input, start) = fsm_pattern(input)?;
66 let (input, trns) = many1(alt((
67 fsm_state_transition,
68 fsm_output,
69 fsm_async_transition,
70 fsm_statement_transition,
71 fsm_block_transition)))(input)?;
72 Ok((input, FsmArm::Transition(start, trns)))
73}
74
75pub fn fsm_state_transition(input: ParseString) -> ParseResult<Transition> {
77 let (input, _) = transition_operator(input)?;
78 let (input, ptrn) = fsm_pattern(input)?;
79 Ok((input, Transition::Next(ptrn)))
80}
81
82pub fn fsm_async_transition(input: ParseString) -> ParseResult<Transition> {
84 let (input, _) = async_transition_operator(input)?;
85 let (input, ptrn) = fsm_pattern(input)?;
86 Ok((input, Transition::Async(ptrn)))
87}
88
89pub fn fsm_statement_transition(input: ParseString) -> ParseResult<Transition> {
91 let (input, _) = transition_operator(input)?;
92 let (input, stmnt) = statement(input)?;
93 Ok((input, Transition::Statement(stmnt)))
94}
95
96pub fn fsm_block_transition(input: ParseString) -> ParseResult<Transition> {
98 let (input, _) = transition_operator(input)?;
99 let (input, _) = left_brace(input)?;
100 let (input, code) = many1(mech_code)(input)?;
101 let (input, _) = right_brace(input)?;
102 Ok((input, Transition::CodeBlock(code)))
103}
104
105
106pub fn fsm_output(input: ParseString) -> ParseResult<Transition> {
108 let (input, _) = output_operator(input)?;
109 let ((input, ptrn)) = fsm_pattern(input)?;
110 Ok((input, Transition::Output(ptrn)))
111}
112
113pub fn fsm_specification(input: ParseString) -> ParseResult<FsmSpecification> {
115 let (input, _) = hashtag(input)?;
116 let (input, name) = identifier(input)?;
117 let (input, _) = left_parenthesis(input)?;
118 let (input, input_vars) = separated_list0(list_separator, var)(input)?;
119 let (input, _) = right_parenthesis(input)?;
120 let (input, _) = opt(output_operator)(input)?;
121 let (input, output) = opt(kind_annotation)(input)?;
122 let (input, _) = define_operator(input)?;
123 let (input, states) = many1(fsm_state_definition)(input)?;
124 let (input, _) = period(input)?;
125 Ok((input, FsmSpecification{name,input: input_vars, output, states}))
126}
127
128pub fn fsm_pattern(input: ParseString) -> ParseResult<Pattern> {
130 match fsm_tuple_struct(input.clone()) {
131 Ok((input, tpl)) => {return Ok((input, Pattern::TupleStruct(tpl)))},
132 _ => ()
133 }
134 match wildcard(input.clone()) {
135 Ok((input, _)) => {return Ok((input, Pattern::Wildcard))},
136 _ => ()
137 }
138 match formula(input.clone()) {
139 Ok((input, Factor::Expression(expr))) => {return Ok((input, Pattern::Expression(*expr)))},
140 Ok((input, frmla)) => {return Ok((input, Pattern::Formula(frmla)))},
141 Err(err) => {return Err(err)},
142 }
143}
144
145pub fn wildcard(input: ParseString) -> ParseResult<Pattern> {
147 let ((input, _)) = asterisk(input)?;
148 Ok((input, Pattern::Wildcard))
149}
150
151pub fn fsm_tuple_struct(input: ParseString) -> ParseResult<PatternTupleStruct> {
153 let (input, _) = grave(input)?;
154 let (input, id) = identifier(input)?;
155 let (input, _) = left_parenthesis(input)?;
156 let (input, patterns) = separated_list1(list_separator, fsm_pattern)(input)?;
157 let (input, _) = right_parenthesis(input)?;
158 Ok((input, PatternTupleStruct{name: id, patterns}))
159}
160
161pub fn fsm_state_definition(input: ParseString) -> ParseResult<StateDefinition> {
163 let (input, _) = guard_operator(input)?;
164 let (input, _) = whitespace0(input)?;
165 let (input, _) = grave(input)?;
166 let (input, name) = identifier(input)?;
167 let (input, vars) = opt(fsm_state_definition_variables)(input)?;
168 Ok((input, StateDefinition{name,state_variables: vars}))
169}
170
171pub fn fsm_state_definition_variables(input: ParseString) -> ParseResult<Vec<Var>> {
173 let (input, _) = left_parenthesis(input)?;
174 let (input, names) = separated_list1(list_separator, var)(input)?;
175 let (input, _) = right_parenthesis(input)?;
176 Ok((input, names))
177}
178
179pub fn fsm_pipe(input: ParseString) -> ParseResult<FsmPipe> {
181 let (input, start) = fsm_instance(input)?;
182 let (input, trns) = many0(alt((fsm_state_transition,fsm_async_transition,fsm_output)))(input)?;
183 Ok((input, FsmPipe{start, transitions: trns}))
184}
185
186pub fn fsm_declare(input: ParseString) -> ParseResult<FsmDeclare> {
188 let (input, fsm) = fsm(input)?;
189 let (input, _) = define_operator(input)?;
190 let (input, pipe) = fsm_pipe(input)?;
191 Ok((input, FsmDeclare{fsm,pipe}))
192}
193
194pub fn fsm(input: ParseString) -> ParseResult<Fsm> {
196 let ((input, _)) = hashtag(input)?;
197 let ((input, name)) = identifier(input)?;
198 let ((input, args)) = opt(argument_list)(input)?;
199 let ((input, kind)) = opt(kind_annotation)(input)?;
200 Ok((input, Fsm{ name, args, kind }))
201}
202
203pub fn fsm_instance(input: ParseString) -> ParseResult<FsmInstance> {
205 let ((input, _)) = hashtag(input)?;
206 let (input, name) = identifier(input)?;
207 let (input, args) = opt(fsm_args)(input)?;
208 Ok((input, FsmInstance{name,args} ))
209}
210
211pub fn fsm_args(input: ParseString) -> ParseResult<Vec<(Option<Identifier>,Expression)>> {
213 let (input, _) = left_parenthesis(input)?;
214 let (input, args) = separated_list0(list_separator, alt((call_arg_with_binding,call_arg)))(input)?;
215 let (input, _) = right_parenthesis(input)?;
216 Ok((input, args))
217}