sv_parser_parser/behavioral_statements/
case_statements.rs1use crate::*;
2
3#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn case_statement(s: Span) -> IResult<Span, CaseStatement> {
8 alt((
9 case_statement_normal,
10 case_statement_matches,
11 case_statement_inside,
12 ))(s)
13}
14
15#[tracable_parser]
16#[packrat_parser]
17pub(crate) fn case_statement_normal(s: Span) -> IResult<Span, CaseStatement> {
18 let (s, a) = opt(unique_priority)(s)?;
19 let (s, b) = case_keyword(s)?;
20 let (s, c) = paren(case_expression)(s)?;
21 let (s, d) = case_item(s)?;
22 let (s, (e, f)) = many_till(case_item, keyword("endcase"))(s)?;
23 Ok((
24 s,
25 CaseStatement::Normal(Box::new(CaseStatementNormal {
26 nodes: (a, b, c, d, e, f),
27 })),
28 ))
29}
30
31#[tracable_parser]
32#[packrat_parser]
33pub(crate) fn case_statement_matches(s: Span) -> IResult<Span, CaseStatement> {
34 let (s, a) = opt(unique_priority)(s)?;
35 let (s, b) = case_keyword(s)?;
36 let (s, c) = paren(case_expression)(s)?;
37 let (s, d) = keyword("matches")(s)?;
38 let (s, e) = case_pattern_item(s)?;
39 let (s, (f, g)) = many_till(case_pattern_item, keyword("endcase"))(s)?;
40 Ok((
41 s,
42 CaseStatement::Matches(Box::new(CaseStatementMatches {
43 nodes: (a, b, c, d, e, f, g),
44 })),
45 ))
46}
47
48#[tracable_parser]
49#[packrat_parser]
50pub(crate) fn case_statement_inside(s: Span) -> IResult<Span, CaseStatement> {
51 let (s, a) = opt(unique_priority)(s)?;
52 let (s, b) = keyword("case")(s)?;
53 let (s, c) = paren(case_expression)(s)?;
54 let (s, d) = keyword("inside")(s)?;
55 let (s, e) = case_inside_item(s)?;
56 let (s, (f, g)) = many_till(case_inside_item, keyword("endcase"))(s)?;
57 Ok((
58 s,
59 CaseStatement::Inside(Box::new(CaseStatementInside {
60 nodes: (a, b, c, d, e, f, g),
61 })),
62 ))
63}
64
65#[tracable_parser]
66#[packrat_parser]
67pub(crate) fn case_keyword(s: Span) -> IResult<Span, CaseKeyword> {
68 alt((
69 map(keyword("casez"), |x| CaseKeyword::Casez(Box::new(x))),
70 map(keyword("casex"), |x| CaseKeyword::Casex(Box::new(x))),
71 map(keyword("case"), |x| CaseKeyword::Case(Box::new(x))),
72 ))(s)
73}
74
75#[tracable_parser]
76#[packrat_parser]
77pub(crate) fn case_expression(s: Span) -> IResult<Span, CaseExpression> {
78 let (s, a) = expression(s)?;
79 Ok((s, CaseExpression { nodes: (a,) }))
80}
81
82#[tracable_parser]
83#[packrat_parser]
84pub(crate) fn case_item(s: Span) -> IResult<Span, CaseItem> {
85 alt((
86 case_item_nondefault,
87 map(case_item_default, |x| CaseItem::Default(Box::new(x))),
88 ))(s)
89}
90
91#[recursive_parser]
92#[tracable_parser]
93#[packrat_parser]
94pub(crate) fn case_item_nondefault(s: Span) -> IResult<Span, CaseItem> {
95 let (s, a) = list(symbol(","), case_item_expression)(s)?;
96 let (s, b) = symbol(":")(s)?;
97 let (s, c) = statement_or_null(s)?;
98 Ok((
99 s,
100 CaseItem::NonDefault(Box::new(CaseItemNondefault { nodes: (a, b, c) })),
101 ))
102}
103
104#[tracable_parser]
105#[packrat_parser]
106pub(crate) fn case_item_default(s: Span) -> IResult<Span, CaseItemDefault> {
107 let (s, a) = keyword("default")(s)?;
108 let (s, b) = opt(symbol(":"))(s)?;
109 let (s, c) = statement_or_null(s)?;
110 Ok((s, CaseItemDefault { nodes: (a, b, c) }))
111}
112
113#[tracable_parser]
114#[packrat_parser]
115pub(crate) fn case_pattern_item(s: Span) -> IResult<Span, CasePatternItem> {
116 alt((
117 case_pattern_item_nondefault,
118 map(case_item_default, |x| CasePatternItem::Default(Box::new(x))),
119 ))(s)
120}
121
122#[recursive_parser]
123#[tracable_parser]
124#[packrat_parser]
125pub(crate) fn case_pattern_item_nondefault(s: Span) -> IResult<Span, CasePatternItem> {
126 let (s, a) = pattern(s)?;
127 let (s, b) = opt(pair(symbol("&&&"), expression))(s)?;
128 let (s, c) = symbol(":")(s)?;
129 let (s, d) = statement_or_null(s)?;
130 Ok((
131 s,
132 CasePatternItem::NonDefault(Box::new(CasePatternItemNondefault {
133 nodes: (a, b, c, d),
134 })),
135 ))
136}
137
138#[tracable_parser]
139#[packrat_parser]
140pub(crate) fn case_inside_item(s: Span) -> IResult<Span, CaseInsideItem> {
141 alt((
142 case_inside_item_nondefault,
143 map(case_item_default, |x| CaseInsideItem::Default(Box::new(x))),
144 ))(s)
145}
146
147#[recursive_parser]
148#[tracable_parser]
149#[packrat_parser]
150pub(crate) fn case_inside_item_nondefault(s: Span) -> IResult<Span, CaseInsideItem> {
151 let (s, a) = open_range_list(s)?;
152 let (s, b) = symbol(":")(s)?;
153 let (s, c) = statement_or_null(s)?;
154 Ok((
155 s,
156 CaseInsideItem::NonDefault(Box::new(CaseInsideItemNondefault { nodes: (a, b, c) })),
157 ))
158}
159
160#[tracable_parser]
161#[packrat_parser]
162pub(crate) fn case_item_expression(s: Span) -> IResult<Span, CaseItemExpression> {
163 let (s, a) = expression(s)?;
164 Ok((s, CaseItemExpression { nodes: (a,) }))
165}
166
167#[tracable_parser]
168#[packrat_parser]
169pub(crate) fn randcase_statement(s: Span) -> IResult<Span, RandcaseStatement> {
170 let (s, a) = keyword("randcase")(s)?;
171 let (s, b) = randcase_item(s)?;
172 let (s, (c, d)) = many_till(randcase_item, keyword("endcase"))(s)?;
173 Ok((
174 s,
175 RandcaseStatement {
176 nodes: (a, b, c, d),
177 },
178 ))
179}
180
181#[recursive_parser]
182#[tracable_parser]
183#[packrat_parser]
184pub(crate) fn randcase_item(s: Span) -> IResult<Span, RandcaseItem> {
185 let (s, a) = expression(s)?;
186 let (s, b) = symbol(":")(s)?;
187 let (s, c) = statement_or_null(s)?;
188 Ok((s, RandcaseItem { nodes: (a, b, c) }))
189}
190
191#[recursive_parser]
192#[tracable_parser]
193#[packrat_parser]
194pub(crate) fn open_range_list(s: Span) -> IResult<Span, OpenRangeList> {
195 let (s, a) = list(symbol(","), open_value_range)(s)?;
196 Ok((s, OpenRangeList { nodes: (a,) }))
197}
198
199#[tracable_parser]
200#[packrat_parser]
201pub(crate) fn open_value_range(s: Span) -> IResult<Span, OpenValueRange> {
202 let (s, a) = value_range(s)?;
203 Ok((s, OpenValueRange { nodes: (a,) }))
204}