scarf_parser/parser/general/
attributes.rs

1// =======================================================================
2// attributes.rs
3// =======================================================================
4// Parsing for 1800-2023 A.9.1
5
6use crate::*;
7use chumsky::prelude::*;
8use scarf_syntax::*;
9
10pub fn attribute_instance_parser<'a, I>()
11-> impl Parser<'a, I, AttributeInstance<'a>, ParserError<'a>>
12where
13    I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
14{
15    token(Token::ParenStar)
16        .then(attr_spec_parser())
17        .then(
18            token(Token::Comma)
19                .then(attr_spec_parser())
20                .repeated()
21                .collect::<Vec<(Metadata<'a>, AttrSpec<'a>)>>(),
22        )
23        .then(token(Token::StarEparen))
24        .map(|(((a, b), c), d)| AttributeInstance(a, b, c, d))
25}
26
27pub fn attr_spec_parser<'a, I>() -> impl Parser<'a, I, AttrSpec<'a>, ParserError<'a>>
28where
29    I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
30{
31    attr_name_parser()
32        .then(token(Token::Eq).then(constant_expression_parser()).or_not())
33        .map(|(a, b)| AttrSpec(a, b))
34}
35
36pub fn attr_name_parser<'a, I>() -> impl Parser<'a, I, AttrName<'a>, ParserError<'a>>
37where
38    I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
39{
40    identifier_parser().map(|a| AttrName(a))
41}