scarf_parser/parser/general/
identifiers.rs1use crate::*;
7use chumsky::prelude::*;
8use scarf_syntax::*;
9
10pub fn array_identifier_parser<'a, I>() -> impl Parser<'a, I, ArrayIdentifier<'a>, ParserError<'a>>
11where
12 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
13{
14 identifier_parser().map(|a| ArrayIdentifier(a))
15}
16
17pub fn block_identifier_parser<'a, I>() -> impl Parser<'a, I, BlockIdentifier<'a>, ParserError<'a>>
18where
19 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
20{
21 identifier_parser().map(|a| BlockIdentifier(a))
22}
23
24pub fn bin_identifier_parser<'a, I>() -> impl Parser<'a, I, BinIdentifier<'a>, ParserError<'a>>
25where
26 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
27{
28 identifier_parser().map(|a| BinIdentifier(a))
29}
30
31pub fn c_identifier_parser<'a, I>() -> impl Parser<'a, I, CIdentifier<'a>, ParserError<'a>>
32where
33 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
34{
35 select! {
36 Token::SimpleIdentifier(text) = e if !(text.contains("$")) => CIdentifier(text, Metadata{
37 span: convert_span(e.span()),
38 extra_nodes: Vec::new()
39 })
40 }
41 .labelled("a C identifier")
42 .then(extra_node_parser())
43 .map(|(identifier, b)| match identifier {
44 CIdentifier(text, metadata) => CIdentifier(text, replace_nodes(metadata, b)),
45 })
46}
47
48pub fn cell_identifier_parser<'a, I>() -> impl Parser<'a, I, CellIdentifier<'a>, ParserError<'a>>
49where
50 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
51{
52 identifier_parser().map(|a| CellIdentifier(a))
53}
54
55pub fn checker_identifier_parser<'a, I>()
56-> impl Parser<'a, I, CheckerIdentifier<'a>, ParserError<'a>>
57where
58 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
59{
60 identifier_parser().map(|a| CheckerIdentifier(a))
61}
62
63pub fn class_identifier_parser<'a, I>() -> impl Parser<'a, I, ClassIdentifier<'a>, ParserError<'a>>
64where
65 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
66{
67 identifier_parser().map(|a| ClassIdentifier(a))
68}
69
70pub fn class_variable_identifier_parser<'a, I>()
71-> impl Parser<'a, I, ClassVariableIdentifier<'a>, ParserError<'a>>
72where
73 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
74{
75 variable_identifier_parser().map(|a| ClassVariableIdentifier(a))
76}
77
78pub fn clocking_identifier_parser<'a, I>()
79-> impl Parser<'a, I, ClockingIdentifier<'a>, ParserError<'a>>
80where
81 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
82{
83 identifier_parser().map(|a| ClockingIdentifier(a))
84}
85
86pub fn modport_identifier_parser<'a, I>()
87-> impl Parser<'a, I, ModportIdentifier<'a>, ParserError<'a>>
88where
89 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
90{
91 identifier_parser().map(|a| ModportIdentifier(a))
92}
93
94pub fn module_identifier_parser<'a, I>() -> impl Parser<'a, I, ModuleIdentifier<'a>, ParserError<'a>>
95where
96 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
97{
98 identifier_parser().map(|a| ModuleIdentifier(a))
99}
100
101pub fn identifier_parser<'a, I>() -> impl Parser<'a, I, Identifier<'a>, ParserError<'a>>
102where
103 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
104{
105 select! {
106 Token::SimpleIdentifier(text) = e => Identifier::SimpleIdentifier((text, Metadata{
107 span: convert_span(e.span()),
108 extra_nodes: Vec::new()
109 })),
110 Token::EscapedIdentifier(text) = e => Identifier::EscapedIdentifier((text, Metadata{
111 span: convert_span(e.span()),
112 extra_nodes: Vec::new()
113 })),
114 }
115 .labelled("an identifier")
116 .then(extra_node_parser())
117 .map(|(identifier, b)| match identifier {
118 Identifier::SimpleIdentifier((text, metadata)) => {
119 Identifier::SimpleIdentifier((text, replace_nodes(metadata, b)))
120 }
121 Identifier::EscapedIdentifier((text, metadata)) => {
122 Identifier::EscapedIdentifier((text, replace_nodes(metadata, b)))
123 }
124 })
125}
126
127pub fn interface_identifier_parser<'a, I>()
128-> impl Parser<'a, I, InterfaceIdentifier<'a>, ParserError<'a>>
129where
130 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
131{
132 identifier_parser().map(|a| InterfaceIdentifier(a))
133}
134
135pub fn package_identifier_parser<'a, I>()
136-> impl Parser<'a, I, PackageIdentifier<'a>, ParserError<'a>>
137where
138 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
139{
140 identifier_parser().map(|a| PackageIdentifier(a))
141}
142
143pub fn parameter_identifier_parser<'a, I>()
144-> impl Parser<'a, I, ParameterIdentifier<'a>, ParserError<'a>>
145where
146 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
147{
148 identifier_parser().map(|a| ParameterIdentifier(a))
149}
150
151pub fn port_identifier_parser<'a, I>() -> impl Parser<'a, I, PortIdentifier<'a>, ParserError<'a>>
152where
153 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
154{
155 identifier_parser().map(|a| PortIdentifier(a))
156}
157
158pub fn program_identifier_parser<'a, I>()
159-> impl Parser<'a, I, ProgramIdentifier<'a>, ParserError<'a>>
160where
161 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
162{
163 identifier_parser().map(|a| ProgramIdentifier(a))
164}
165
166pub fn type_identifier_parser<'a, I>() -> impl Parser<'a, I, TypeIdentifier<'a>, ParserError<'a>>
167where
168 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
169{
170 identifier_parser().map(|a| TypeIdentifier(a))
171}
172
173pub fn variable_identifier_parser<'a, I>()
174-> impl Parser<'a, I, VariableIdentifier<'a>, ParserError<'a>>
175where
176 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
177{
178 identifier_parser().map(|a| VariableIdentifier(a))
179}