1
2
3
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 }