scarf_parser/parser/declarations/
declaration_ranges.rs

1// =======================================================================
2// declaration_ranges.rs
3// =======================================================================
4// Parsing for 1800-2023 A.2.5
5
6use crate::*;
7use chumsky::prelude::*;
8use scarf_syntax::*;
9
10pub fn unpacked_dimension_parser<'a, I>()
11-> impl Parser<'a, I, UnpackedDimension<'a>, ParserError<'a>>
12where
13    I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
14{
15    let unpacked_range_parser = token(Token::Bracket)
16        .then(constant_range_parser())
17        .then(token(Token::EBracket))
18        .map(|((a, b), c)| UnpackedDimension::UnpackedRange(Box::new((a, b, c))));
19    let unpacked_expression_parser = token(Token::Bracket)
20        .then(constant_expression_parser())
21        .then(token(Token::EBracket))
22        .map(|((a, b), c)| UnpackedDimension::UnpackedExpression(Box::new((a, b, c))));
23    choice((unpacked_range_parser, unpacked_expression_parser))
24}
25
26pub fn packed_dimension_parser<'a, I>() -> impl Parser<'a, I, PackedDimension<'a>, ParserError<'a>>
27where
28    I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
29{
30    let packed_range_parser = token(Token::Bracket)
31        .then(constant_range_parser())
32        .then(token(Token::EBracket))
33        .map(|((a, b), c)| PackedDimension::PackedRange(Box::new((a, b, c))));
34    choice((
35        packed_range_parser,
36        unsized_dimension_parser().map(|a| PackedDimension::UnsizedDimension(Box::new(a))),
37    ))
38}
39
40pub fn associative_dimension_parser<'a, I>()
41-> impl Parser<'a, I, AssociativeDimension<'a>, ParserError<'a>>
42where
43    I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
44{
45    let data_parser = token(Token::Bracket)
46        .then(data_type_parser())
47        .then(token(Token::EBracket))
48        .map(|((a, b), c)| AssociativeDimension::Data(Box::new((a, b, c))));
49    let star_parser = token(Token::Bracket)
50        .then(token(Token::Star))
51        .then(token(Token::EBracket))
52        .map(|((a, b), c)| AssociativeDimension::Star(Box::new((a, b, c))));
53    choice((data_parser, star_parser))
54}
55
56pub fn variable_dimension_parser<'a, I>()
57-> impl Parser<'a, I, VariableDimension<'a>, ParserError<'a>>
58where
59    I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
60{
61    choice((
62        unsized_dimension_parser().map(|a| VariableDimension::UnsizedDimension(Box::new(a))),
63        unpacked_dimension_parser().map(|a| VariableDimension::UnpackedDimension(Box::new(a))),
64        associative_dimension_parser()
65            .map(|a| VariableDimension::AssociativeDimension(Box::new(a))),
66        queue_dimension_parser().map(|a| VariableDimension::QueueDimension(Box::new(a))),
67    ))
68}
69
70pub fn queue_dimension_parser<'a, I>() -> impl Parser<'a, I, QueueDimension<'a>, ParserError<'a>>
71where
72    I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
73{
74    token(Token::Bracket)
75        .then(token(Token::Dollar))
76        .then(
77            token(Token::Colon)
78                .then(constant_expression_parser())
79                .or_not(),
80        )
81        .then(token(Token::EBracket))
82        .map(|(((a, b), c), d)| QueueDimension(a, b, c, d))
83}
84
85pub fn unsized_dimension_parser<'a, I>() -> impl Parser<'a, I, UnsizedDimension<'a>, ParserError<'a>>
86where
87    I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
88{
89    token(Token::Bracket)
90        .then(token(Token::EBracket))
91        .map(|(a, b)| UnsizedDimension(a, b))
92}