sv_parser_parser/behavioral_statements/
patterns.rs1use crate::*;
2
3#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn pattern(s: Span) -> IResult<Span, Pattern> {
8 alt((
9 pattern_variable,
10 map(symbol(".*"), |x| Pattern::Asterisk(Box::new(x))),
11 map(constant_expression, |x| {
12 Pattern::ConstantExpression(Box::new(x))
13 }),
14 pattern_tagged,
15 pattern_list,
16 pattern_identifier_list,
17 ))(s)
18}
19
20#[tracable_parser]
21#[packrat_parser]
22pub(crate) fn pattern_variable(s: Span) -> IResult<Span, Pattern> {
23 let (s, a) = symbol(".")(s)?;
24 let (s, b) = variable_identifier(s)?;
25 Ok((
26 s,
27 Pattern::Variable(Box::new(PatternVariable { nodes: (a, b) })),
28 ))
29}
30
31#[tracable_parser]
32#[packrat_parser]
33pub(crate) fn pattern_tagged(s: Span) -> IResult<Span, Pattern> {
34 let (s, a) = keyword("tagged")(s)?;
35 let (s, b) = member_identifier(s)?;
36 let (s, c) = opt(pattern)(s)?;
37 Ok((
38 s,
39 Pattern::Tagged(Box::new(PatternTagged { nodes: (a, b, c) })),
40 ))
41}
42
43#[tracable_parser]
44#[packrat_parser]
45pub(crate) fn pattern_list(s: Span) -> IResult<Span, Pattern> {
46 let (s, a) = apostrophe_brace(list(symbol(","), pattern))(s)?;
47 Ok((s, Pattern::List(Box::new(PatternList { nodes: (a,) }))))
48}
49
50#[tracable_parser]
51#[packrat_parser]
52pub(crate) fn pattern_identifier_list(s: Span) -> IResult<Span, Pattern> {
53 let (s, a) = apostrophe_brace(list(
54 symbol(","),
55 triple(member_identifier, symbol(":"), pattern),
56 ))(s)?;
57 Ok((
58 s,
59 Pattern::IdentifierList(Box::new(PatternIdentifierList { nodes: (a,) })),
60 ))
61}
62
63#[tracable_parser]
64#[packrat_parser]
65pub(crate) fn assignment_pattern(s: Span) -> IResult<Span, AssignmentPattern> {
66 alt((
67 assignment_pattern_list,
68 assignment_pattern_structure,
69 assignment_pattern_array,
70 assignment_pattern_repeat,
71 ))(s)
72}
73
74#[tracable_parser]
75#[packrat_parser]
76pub(crate) fn assignment_pattern_list(s: Span) -> IResult<Span, AssignmentPattern> {
77 let (s, a) = apostrophe_brace(list(symbol(","), expression))(s)?;
78 Ok((
79 s,
80 AssignmentPattern::List(Box::new(AssignmentPatternList { nodes: (a,) })),
81 ))
82}
83
84#[tracable_parser]
85#[packrat_parser]
86pub(crate) fn assignment_pattern_structure(s: Span) -> IResult<Span, AssignmentPattern> {
87 let (s, a) = apostrophe_brace(list(
88 symbol(","),
89 triple(structure_pattern_key, symbol(":"), expression),
90 ))(s)?;
91 Ok((
92 s,
93 AssignmentPattern::Structure(Box::new(AssignmentPatternStructure { nodes: (a,) })),
94 ))
95}
96
97#[tracable_parser]
98#[packrat_parser]
99pub(crate) fn assignment_pattern_array(s: Span) -> IResult<Span, AssignmentPattern> {
100 let (s, a) = apostrophe_brace(list(
101 symbol(","),
102 triple(array_pattern_key, symbol(":"), expression),
103 ))(s)?;
104 Ok((
105 s,
106 AssignmentPattern::Array(Box::new(AssignmentPatternArray { nodes: (a,) })),
107 ))
108}
109
110#[tracable_parser]
111#[packrat_parser]
112pub(crate) fn assignment_pattern_repeat(s: Span) -> IResult<Span, AssignmentPattern> {
113 let (s, a) = apostrophe_brace(pair(
114 constant_expression,
115 brace(list(symbol(","), expression)),
116 ))(s)?;
117 Ok((
118 s,
119 AssignmentPattern::Repeat(Box::new(AssignmentPatternRepeat { nodes: (a,) })),
120 ))
121}
122
123#[tracable_parser]
124#[packrat_parser]
125pub(crate) fn structure_pattern_key(s: Span) -> IResult<Span, StructurePatternKey> {
126 alt((
127 map(member_identifier, |x| {
128 StructurePatternKey::MemberIdentifier(Box::new(x))
129 }),
130 map(assignment_pattern_key, |x| {
131 StructurePatternKey::AssignmentPatternKey(Box::new(x))
132 }),
133 ))(s)
134}
135
136#[tracable_parser]
137#[packrat_parser]
138pub(crate) fn array_pattern_key(s: Span) -> IResult<Span, ArrayPatternKey> {
139 alt((
140 map(constant_expression, |x| {
141 ArrayPatternKey::ConstantExpression(Box::new(x))
142 }),
143 map(assignment_pattern_key, |x| {
144 ArrayPatternKey::AssignmentPatternKey(Box::new(x))
145 }),
146 ))(s)
147}
148
149#[tracable_parser]
150#[packrat_parser]
151pub(crate) fn assignment_pattern_key(s: Span) -> IResult<Span, AssignmentPatternKey> {
152 alt((
153 map(simple_type, |x| {
154 AssignmentPatternKey::SimpleType(Box::new(x))
155 }),
156 map(keyword("default"), |x| {
157 AssignmentPatternKey::Default(Box::new(x))
158 }),
159 ))(s)
160}
161
162#[tracable_parser]
163#[packrat_parser]
164pub(crate) fn assignment_pattern_expression(s: Span) -> IResult<Span, AssignmentPatternExpression> {
165 let (s, a) = opt(assignment_pattern_expression_type)(s)?;
166 let (s, b) = assignment_pattern(s)?;
167 Ok((s, AssignmentPatternExpression { nodes: (a, b) }))
168}
169
170#[tracable_parser]
171#[packrat_parser]
172pub(crate) fn assignment_pattern_expression_type(
173 s: Span,
174) -> IResult<Span, AssignmentPatternExpressionType> {
175 alt((
176 map(ps_type_identifier, |x| {
177 AssignmentPatternExpressionType::PsTypeIdentifier(Box::new(x))
178 }),
179 map(ps_parameter_identifier, |x| {
180 AssignmentPatternExpressionType::PsParameterIdentifier(Box::new(x))
181 }),
182 map(integer_atom_type, |x| {
183 AssignmentPatternExpressionType::IntegerAtomType(Box::new(x))
184 }),
185 map(type_reference, |x| {
186 AssignmentPatternExpressionType::TypeReference(Box::new(x))
187 }),
188 ))(s)
189}
190
191#[tracable_parser]
192#[packrat_parser]
193pub(crate) fn constant_assignment_pattern_expression(
194 s: Span,
195) -> IResult<Span, ConstantAssignmentPatternExpression> {
196 let (s, a) = assignment_pattern_expression(s)?;
197 Ok((s, ConstantAssignmentPatternExpression { nodes: (a,) }))
198}
199
200#[tracable_parser]
201#[packrat_parser]
202pub(crate) fn assignment_pattern_net_lvalue(s: Span) -> IResult<Span, AssignmentPatternNetLvalue> {
203 let (s, a) = apostrophe_brace(list(symbol(","), net_lvalue))(s)?;
204 Ok((s, AssignmentPatternNetLvalue { nodes: (a,) }))
205}
206
207#[tracable_parser]
208#[packrat_parser]
209pub(crate) fn assignment_pattern_variable_lvalue(
210 s: Span,
211) -> IResult<Span, AssignmentPatternVariableLvalue> {
212 let (s, a) = apostrophe_brace(list(symbol(","), variable_lvalue))(s)?;
213 Ok((s, AssignmentPatternVariableLvalue { nodes: (a,) }))
214}