scarf_parser/parser/general/
identifiers.rs

1// =======================================================================
2// mod.rs
3// =======================================================================
4// Parsing for 1800-2023 A.9.3
5
6use 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}