1 // =================================
 2 // Copyright (c) 2020 Seppo Laakko
 3 // Distributed under the MIT license
 4 // =================================
 5 
 6 [hpp]#include <sngcm/cmparser/ParserApi.hpp>
 7 [hpp]#include <sngcm/ast/Template.hpp>
 8 [hpp]#include <sngcm/cmparser/Identifier.hpp>
 9 [hpp]#include <sngcm/cmparser/TypeExpr.hpp>
10 [hpp]#include <sngcm/cmparser/ParsingContext.hpp>
11 [cpp]#include <sngcm/cmlexer/CmajorLexer.hpp>
12 [cpp]#include <sngcm/cmlexer/CmajorTokens.hpp>
13 
14 using namespace sngcm::ast;
15 using namespace CmajorTokens;
16 
17 parser api(SNGCM_PARSER_API) TemplateParser
18 {
19     uselexer CmajorLexer;
20 
21     using IdentifierParser.Identifier;
22     using IdentifierParser.QualifiedId;
23     using TypeExprParser.TypeExpr;
24 
25     TemplateId(ParsingContext* ctx, var std::unique_ptr templateId, var Span e) : Node*
26         ::= empty{ ctx->BeginParsingTemplateId(); }
27             (QualifiedId:primary{ templateId.reset(new TemplateIdNode(span, primary)); }
28             LANGLE{ ++lexer.leftAngleCount; }
29             ((TypeExpr(ctx):templateArg{ templateId->AddTemplateArgument(templateArg); } % COMMA) RANGLE{ e = span; }){ --lexer.leftAngleCount; } / { --lexer.leftAngleCount; })
30         {
31             templateId->SetSpanEnd(e.end);
32             ctx->EndParsingTemplateId();
33             return templateId.release();
34         }
35         /
36         {
37             ctx->EndParsingTemplateId();
38         }
39         ;
40 
41     TemplateParameter(ParsingContext* ctx) : TemplateParameterNode*
42         ::= (Identifier:id (ASSIGN TypeExpr(ctx):type)?){ return new TemplateParameterNode(span, id, type); }
43         ;
44 
45     TemplateParameterList(ParsingContext* ctx, sngcm::ast::Node* owner)
46         ::= LANGLE (TemplateParameter(ctx):tp{ owner->AddTemplateParameter(tp); } % COMMA) RANGLE!
47         ;
48 
49     ruleinfo
50     {
51         (TemplateId, "template identifier"), (TemplateParameter, "template parameter"), (TemplateParameterList, "template parameter list")
52     }
53 }