scarf_parser/parser/declarations/
declaration_lists.rs

1// =======================================================================
2// declaration_lists.rs
3// =======================================================================
4// Parsing for 1800-2023 A.2.3
5
6use 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>, // ,
33                    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>, // ,
78                    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>, // ,
123                    VariableIdentifier<'a>,
124                    Vec<VariableDimension<'a>>,
125                )>>(),
126        )
127        .map(|((a, b), c)| ListOfVariableIdentifiers(a, b, c))
128}