sv_parser_parser/behavioral_statements/
looping_statements.rs

1use crate::*;
2
3// -----------------------------------------------------------------------------
4
5#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn loop_statement(s: Span) -> IResult<Span, LoopStatement> {
8    alt((
9        loop_statement_forever,
10        loop_statement_repeat,
11        loop_statement_while,
12        loop_statement_for,
13        loop_statement_do_while,
14        loop_statement_foreach,
15    ))(s)
16}
17
18#[tracable_parser]
19#[packrat_parser]
20pub(crate) fn loop_statement_forever(s: Span) -> IResult<Span, LoopStatement> {
21    let (s, a) = keyword("forever")(s)?;
22    let (s, b) = statement_or_null(s)?;
23    Ok((
24        s,
25        LoopStatement::Forever(Box::new(LoopStatementForever { nodes: (a, b) })),
26    ))
27}
28
29#[tracable_parser]
30#[packrat_parser]
31pub(crate) fn loop_statement_repeat(s: Span) -> IResult<Span, LoopStatement> {
32    let (s, a) = keyword("repeat")(s)?;
33    let (s, b) = paren(expression)(s)?;
34    let (s, c) = statement_or_null(s)?;
35    Ok((
36        s,
37        LoopStatement::Repeat(Box::new(LoopStatementRepeat { nodes: (a, b, c) })),
38    ))
39}
40
41#[tracable_parser]
42#[packrat_parser]
43pub(crate) fn loop_statement_while(s: Span) -> IResult<Span, LoopStatement> {
44    let (s, a) = keyword("while")(s)?;
45    let (s, b) = paren(expression)(s)?;
46    let (s, c) = statement_or_null(s)?;
47    Ok((
48        s,
49        LoopStatement::While(Box::new(LoopStatementWhile { nodes: (a, b, c) })),
50    ))
51}
52
53#[tracable_parser]
54#[packrat_parser]
55pub(crate) fn loop_statement_for(s: Span) -> IResult<Span, LoopStatement> {
56    let (s, a) = keyword("for")(s)?;
57    let (s, b) = paren(tuple((
58        opt(for_initialization),
59        symbol(";"),
60        opt(expression),
61        symbol(";"),
62        opt(for_step),
63    )))(s)?;
64    let (s, c) = statement_or_null(s)?;
65    Ok((
66        s,
67        LoopStatement::For(Box::new(LoopStatementFor { nodes: (a, b, c) })),
68    ))
69}
70
71#[tracable_parser]
72#[packrat_parser]
73pub(crate) fn loop_statement_do_while(s: Span) -> IResult<Span, LoopStatement> {
74    let (s, a) = keyword("do")(s)?;
75    let (s, b) = statement_or_null(s)?;
76    let (s, c) = keyword("while")(s)?;
77    let (s, d) = paren(expression)(s)?;
78    let (s, e) = symbol(";")(s)?;
79    Ok((
80        s,
81        LoopStatement::DoWhile(Box::new(LoopStatementDoWhile {
82            nodes: (a, b, c, d, e),
83        })),
84    ))
85}
86
87#[tracable_parser]
88#[packrat_parser]
89pub(crate) fn loop_statement_foreach(s: Span) -> IResult<Span, LoopStatement> {
90    let (s, a) = keyword("foreach")(s)?;
91    let (s, b) = paren(pair(
92        ps_or_hierarchical_array_identifier,
93        bracket(loop_variables),
94    ))(s)?;
95    let (s, c) = statement(s)?;
96    Ok((
97        s,
98        LoopStatement::Foreach(Box::new(LoopStatementForeach { nodes: (a, b, c) })),
99    ))
100}
101
102#[tracable_parser]
103#[packrat_parser]
104pub(crate) fn for_initialization(s: Span) -> IResult<Span, ForInitialization> {
105    alt((
106        map(list_of_variable_assignments, |x| {
107            ForInitialization::ListOfVariableAssignments(Box::new(x))
108        }),
109        for_initialization_declaration,
110    ))(s)
111}
112
113#[recursive_parser]
114#[tracable_parser]
115#[packrat_parser]
116pub(crate) fn for_initialization_declaration(s: Span) -> IResult<Span, ForInitialization> {
117    let (s, a) = list(symbol(","), for_variable_declaration)(s)?;
118    Ok((
119        s,
120        ForInitialization::Declaration(Box::new(ForInitializationDeclaration { nodes: (a,) })),
121    ))
122}
123
124#[tracable_parser]
125#[packrat_parser]
126pub(crate) fn for_variable_declaration(s: Span) -> IResult<Span, ForVariableDeclaration> {
127    let (s, a) = opt(var)(s)?;
128    let (s, b) = data_type(s)?;
129    let (s, c) = list(
130        symbol(","),
131        triple(variable_identifier, symbol("="), expression),
132    )(s)?;
133    Ok((s, ForVariableDeclaration { nodes: (a, b, c) }))
134}
135
136#[tracable_parser]
137#[packrat_parser]
138pub(crate) fn var(s: Span) -> IResult<Span, Var> {
139    let (s, a) = keyword("var")(s)?;
140    Ok((s, Var { nodes: (a,) }))
141}
142
143#[recursive_parser]
144#[tracable_parser]
145#[packrat_parser]
146pub(crate) fn for_step(s: Span) -> IResult<Span, ForStep> {
147    let (s, a) = list(symbol(","), for_step_assignment)(s)?;
148    Ok((s, ForStep { nodes: (a,) }))
149}
150
151#[tracable_parser]
152#[packrat_parser]
153pub(crate) fn for_step_assignment(s: Span) -> IResult<Span, ForStepAssignment> {
154    alt((
155        map(operator_assignment, |x| {
156            ForStepAssignment::OperatorAssignment(Box::new(x))
157        }),
158        map(inc_or_dec_expression, |x| {
159            ForStepAssignment::IncOrDecExpression(Box::new(x))
160        }),
161        map(function_subroutine_call, |x| {
162            ForStepAssignment::FunctionSubroutineCall(Box::new(x))
163        }),
164    ))(s)
165}
166
167#[tracable_parser]
168#[packrat_parser]
169pub(crate) fn loop_variables(s: Span) -> IResult<Span, LoopVariables> {
170    let (s, a) = list(symbol(","), opt(index_variable_identifier))(s)?;
171    Ok((s, LoopVariables { nodes: (a,) }))
172}