From 84f381cc180b3176d6a58da4085ee8470f246922 Mon Sep 17 00:00:00 2001 From: "YONGH\\yongh" Date: Mon, 30 Oct 2017 21:18:20 -0400 Subject: work in-progress, add parsing for assoc type decls and member type expressions --- source/slang/parser.cpp | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) (limited to 'source/slang/parser.cpp') diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp index 322f403e6..554eebc18 100644 --- a/source/slang/parser.cpp +++ b/source/slang/parser.cpp @@ -544,6 +544,21 @@ namespace Slang return typeDefDecl; } + RefPtr ParseAssocType(Parser * parser, void *) + { + RefPtr assocTypeDecl = new AssocTypeDecl(); + + auto nameToken = parser->ReadToken(TokenType::Identifier); + assocTypeDecl->nameAndLoc = NameLoc(nameToken); + assocTypeDecl->loc = nameToken.loc; + if (parser->LookAheadToken(TokenType::Colon)) + { + auto type = parser->ParseTypeExp(); + assocTypeDecl->constraint = type; + } + return assocTypeDecl; + } + // Add a modifier to a list of modifiers being built static void AddModifier(RefPtr** ioModifierLink, RefPtr modifier) { @@ -1396,6 +1411,16 @@ namespace Slang return genericApp; } + static RefPtr parseMemberType(Parser * parser, RefPtr base) + { + RefPtr memberExpr = new MemberExpr(); + parser->ReadToken(TokenType::Dot); + parser->FillPosition(memberExpr.Ptr()); + memberExpr->BaseExpression = base; + memberExpr->name = expectIdentifier(parser).name; + return memberExpr; + } + // Parse option `[]` braces after a type expression, that indicate an array type static RefPtr parsePostfixTypeSuffix( Parser* parser, @@ -1452,9 +1477,16 @@ namespace Slang RefPtr typeExpr = basicType; - if (parser->LookAheadToken(TokenType::OpLess)) + while (parser->LookAheadToken(TokenType::OpLess) || parser->LookAheadToken(TokenType::Dot)) { - typeExpr = parseGenericApp(parser, typeExpr); + if (parser->LookAheadToken(TokenType::OpLess)) + { + typeExpr = parseGenericApp(parser, typeExpr); + } + else + { + typeExpr = parseMemberType(parser, typeExpr); + } } // GLSL allows `[]` directly in a type specifier @@ -4029,8 +4061,8 @@ namespace Slang // Add syntax for declaration keywords #define DECL(KEYWORD, CALLBACK) \ addBuiltinSyntax(session, scope, #KEYWORD, &CALLBACK) - DECL(typedef, ParseTypeDef); + DECL(assoctype, ParseAssocType); DECL(cbuffer, parseHLSLCBufferDecl); DECL(tbuffer, parseHLSLTBufferDecl); DECL(__generic, ParseGenericDecl); -- cgit v1.2.3