scarf_parser/parser/declarations/
declaration_ranges.rs1use 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}