scarf_parser/parser/declarations/
declaration_lists.rs1use crate::*;
7use chumsky::prelude::*;
8use scarf_syntax::*;
9
10pub fn list_of_interface_identifiers_parser<'a, I>()
11-> impl Parser<'a, I, ListOfInterfaceIdentifiers<'a>, ParserError<'a>>
12where
13 I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
14{
15 interface_identifier_parser()
16 .then(
17 unpacked_dimension_parser()
18 .repeated()
19 .collect::<Vec<UnpackedDimension<'a>>>(),
20 )
21 .then(
22 token(Token::Colon)
23 .then(interface_identifier_parser())
24 .then(
25 unpacked_dimension_parser()
26 .repeated()
27 .collect::<Vec<UnpackedDimension<'a>>>(),
28 )
29 .map(|((a, b), c)| (a, b, c))
30 .repeated()
31 .collect::<Vec<(
32 Metadata<'a>, InterfaceIdentifier<'a>,
34 Vec<UnpackedDimension<'a>>,
35 )>>(),
36 )
37 .map(|((a, b), c)| ListOfInterfaceIdentifiers(a, b, c))
38}
39
40pub fn list_of_param_assignments_parser<'a, I>()
41-> impl Parser<'a, I, ListOfParamAssignments<'a>, ParserError<'a>>
42where
43 I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
44{
45 param_assignment_parser()
46 .then(
47 token(Token::Colon)
48 .then(param_assignment_parser())
49 .repeated()
50 .collect::<Vec<(Metadata<'a>, ParamAssignment<'a>)>>(),
51 )
52 .map(|(a, b)| ListOfParamAssignments(a, b))
53}
54
55pub fn list_of_port_identifiers_parser<'a, I>()
56-> impl Parser<'a, I, ListOfPortIdentifiers<'a>, ParserError<'a>>
57where
58 I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
59{
60 port_identifier_parser()
61 .then(
62 unpacked_dimension_parser()
63 .repeated()
64 .collect::<Vec<UnpackedDimension<'a>>>(),
65 )
66 .then(
67 token(Token::Colon)
68 .then(port_identifier_parser())
69 .then(
70 unpacked_dimension_parser()
71 .repeated()
72 .collect::<Vec<UnpackedDimension<'a>>>(),
73 )
74 .map(|((a, b), c)| (a, b, c))
75 .repeated()
76 .collect::<Vec<(
77 Metadata<'a>, PortIdentifier<'a>,
79 Vec<UnpackedDimension<'a>>,
80 )>>(),
81 )
82 .map(|((a, b), c)| ListOfPortIdentifiers(a, b, c))
83}
84
85pub fn list_of_type_assignments_parser<'a, I>()
86-> impl Parser<'a, I, ListOfTypeAssignments<'a>, ParserError<'a>>
87where
88 I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
89{
90 type_assignment_parser()
91 .then(
92 token(Token::Colon)
93 .then(type_assignment_parser())
94 .repeated()
95 .collect::<Vec<(Metadata<'a>, TypeAssignment<'a>)>>(),
96 )
97 .map(|(a, b)| ListOfTypeAssignments(a, b))
98}
99
100pub fn list_of_variable_identifiers_parser<'a, I>()
101-> impl Parser<'a, I, ListOfVariableIdentifiers<'a>, ParserError<'a>>
102where
103 I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
104{
105 variable_identifier_parser()
106 .then(
107 variable_dimension_parser()
108 .repeated()
109 .collect::<Vec<VariableDimension<'a>>>(),
110 )
111 .then(
112 token(Token::Colon)
113 .then(variable_identifier_parser())
114 .then(
115 variable_dimension_parser()
116 .repeated()
117 .collect::<Vec<VariableDimension<'a>>>(),
118 )
119 .map(|((a, b), c)| (a, b, c))
120 .repeated()
121 .collect::<Vec<(
122 Metadata<'a>, VariableIdentifier<'a>,
124 Vec<VariableDimension<'a>>,
125 )>>(),
126 )
127 .map(|((a, b), c)| ListOfVariableIdentifiers(a, b, c))
128}