1 // =================================
 2 // Copyright (c) 2021 Seppo Laakko
 3 // Distributed under the MIT license
 4 // =================================
 5 
 6 [hpp]#include <sngcm/cmparser/ParserApi.hpp>
 7 [hpp]#include <sngcm/ast/Attribute.hpp>
 8 [cpp]#include <sngcm/cmlexer/CmajorLexer.hpp>
 9 [cpp]#include <sngcm/cmlexer/CmajorTokens.hpp>
10 [cpp]#include <sngcm/cmlexer/TokenValueParsers.hpp>
11 
12 using namespace CmajorTokens;
13 
14 parser api(SNGCM_PARSER_API) AttributeParser
15 {
16     uselexer CmajorLexer;
17 
18     Attributes(boost::uuids::uuid* moduleId, var std::unique_ptr attributes) : sngcm::ast::AttributesNode*
19         ::= LBRACKET{ attributes.reset(new sngcm::ast::AttributesNode(span, *moduleId)); } (Attribute(attributes.get(), moduleId):attribute % COMMA)? RBRACKET!
20         {
21             return attributes.release();
22         }
23         ;
24 
25     Attribute(sngcm::ast::AttributesNode* attributes, boost::uuids::uuid* moduleId, var Span s, var std::u32string name, var std::u32string value)
26         ::= 
27         (
28             empty{ value = U"true"; }
29             ID{ s = span; name = lexer.GetMatch(span); } 
30             (
31                 ASSIGN STRINGLIT
32                 { 
33                     s.end = span.end; 
34                     ParseStringLiteral(lexer.FileName(), lexer.GetToken(pos), lexer.strLit, lexer.strLitPrefix);
35                     value = lexer.strLit;
36                 }
37             )?
38         )
39         {
40             attributes->AddAttribute(s, *moduleId, name, value);
41         }
42         ;
43 
44     ruleinfo
45     {
46         (Attributes, "attributes"), (Attribute, "attribute")
47     }
48 }