summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-parser.cpp')
-rw-r--r--source/slang/slang-parser.cpp255
1 files changed, 145 insertions, 110 deletions
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp
index 4d93c35a8..12fa90480 100644
--- a/source/slang/slang-parser.cpp
+++ b/source/slang/slang-parser.cpp
@@ -590,7 +590,7 @@ namespace Slang
return false;
}
- NodeBase* ParseTypeDef(Parser* parser, void* /*userData*/)
+ NodeBase* parseTypeDef(Parser* parser, void* /*userData*/)
{
TypeDefDecl* typeDefDecl = parser->astBuilder->create<TypeDefDecl>();
@@ -1214,7 +1214,7 @@ namespace Slang
}
}
- static NodeBase* ParseGenericDecl(Parser* parser, void*)
+ static NodeBase* parseGenericDecl(Parser* parser, void*)
{
GenericDecl* decl = parser->astBuilder->create<GenericDecl>();
parser->FillPosition(decl);
@@ -2420,7 +2420,7 @@ namespace Slang
}
}
- static NodeBase* ParseExtensionDecl(Parser* parser, void* /*userData*/)
+ static NodeBase* parseExtensionDecl(Parser* parser, void* /*userData*/)
{
ExtensionDecl* decl = parser->astBuilder->create<ExtensionDecl>();
parser->FillPosition(decl);
@@ -2770,7 +2770,7 @@ namespace Slang
}
}
- static NodeBase* ParseSubscriptDecl(Parser* parser, void* /*userData*/)
+ static NodeBase* parseSubscriptDecl(Parser* parser, void* /*userData*/)
{
SubscriptDecl* decl = parser->astBuilder->create<SubscriptDecl>();
parser->FillPosition(decl);
@@ -2814,7 +2814,7 @@ namespace Slang
}
}
- static NodeBase* ParsePropertyDecl(Parser* parser, void* /*userData*/)
+ static NodeBase* parsePropertyDecl(Parser* parser, void* /*userData*/)
{
PropertyDecl* decl = parser->astBuilder->create<PropertyDecl>();
parser->FillPosition(decl);
@@ -3020,7 +3020,7 @@ namespace Slang
// This is a catch-all syntax-construction callback to handle cases where
// a piece of syntax is fully defined by the keyword to use, along with
// the class of AST node to construct.
- static NodeBase* parseSimpleSyntax(Parser* parser, void* userData)
+ NodeBase* parseSimpleSyntax(Parser* parser, void* userData)
{
SyntaxClassBase syntaxClass((ReflectClassInfo*) userData);
return (NodeBase*)syntaxClass.createInstanceImpl(parser->astBuilder);
@@ -5662,135 +5662,170 @@ namespace Slang
return modifier;
}
- ModuleDecl* populateBaseLanguageModule(
- ASTBuilder* astBuilder,
- RefPtr<Scope> scope)
- {
- Session* session = astBuilder->getGlobalSession();
-
- ModuleDecl* moduleDecl = astBuilder->create<ModuleDecl>();
- scope->containerDecl = moduleDecl;
-
- // Add syntax for declaration keywords
- #define DECL(KEYWORD, CALLBACK) \
- addBuiltinSyntax<Decl>(session, scope, #KEYWORD, &CALLBACK)
- DECL(typedef, ParseTypeDef);
- DECL(associatedtype, parseAssocType);
- DECL(type_param, parseGlobalGenericTypeParamDecl);
- DECL(cbuffer, parseHLSLCBufferDecl);
- DECL(tbuffer, parseHLSLTBufferDecl);
- DECL(__generic, ParseGenericDecl);
- DECL(__extension, ParseExtensionDecl);
- DECL(extension, ParseExtensionDecl);
- DECL(__init, parseConstructorDecl);
- DECL(__subscript, ParseSubscriptDecl);
- DECL(property, ParsePropertyDecl);
- DECL(interface, parseInterfaceDecl);
- DECL(syntax, parseSyntaxDecl);
- DECL(attribute_syntax,parseAttributeSyntaxDecl);
- DECL(__import, parseImportDecl);
- DECL(import, parseImportDecl);
- DECL(let, parseLetDecl);
- DECL(var, parseVarDecl);
- DECL(func, parseFuncDecl);
- DECL(typealias, parseTypeAliasDecl);
- DECL(__generic_value_param, parseGlobalGenericValueParamDecl);
- DECL(namespace, parseNamespaceDecl);
- DECL(using, parseUsingDecl);
-
- #undef DECL
+ static SyntaxParseInfo _makeParseExpr(const char* keywordName, SyntaxParseCallback callback)
+ {
+ SyntaxParseInfo entry;
+ entry.classInfo = &Expr::kReflectClassInfo;
+ entry.keywordName = keywordName;
+ entry.callback = callback;
+ return entry;
+ }
+ static SyntaxParseInfo _makeParseDecl(const char* keywordName, SyntaxParseCallback callback)
+ {
+ SyntaxParseInfo entry;
+ entry.keywordName = keywordName;
+ entry.callback = callback;
+ entry.classInfo = &Decl::kReflectClassInfo;
+ return entry;
+ }
+ static SyntaxParseInfo _makeParseModifier(const char* keywordName, const ReflectClassInfo& classInfo)
+ {
+ // If we just have class info - use simple parser
+ SyntaxParseInfo entry;
+ entry.keywordName = keywordName;
+ entry.callback = &parseSimpleSyntax;
+ entry.classInfo = &classInfo;
+ return entry;
+ }
+ static SyntaxParseInfo _makeParseModifier(const char* keywordName, SyntaxParseCallback callback)
+ {
+ SyntaxParseInfo entry;
+ entry.keywordName = keywordName;
+ entry.callback = callback;
+ entry.classInfo = &Modifier::kReflectClassInfo;
+ return entry;
+ }
+
+ // Maps a keyword to the associated parsing function
+ static const SyntaxParseInfo g_parseSyntaxEntries[] =
+ {
+ // !!!!!!!!!!!!!!!!!!!! Decls !!!!!!!!!!!!!!!!!!
+
+ _makeParseDecl("typedef", parseTypeDef),
+ _makeParseDecl("associatedtype", parseAssocType),
+ _makeParseDecl("type_param", parseGlobalGenericTypeParamDecl ),
+ _makeParseDecl("cbuffer", parseHLSLCBufferDecl ),
+ _makeParseDecl("tbuffer", parseHLSLTBufferDecl ),
+ _makeParseDecl("__generic", parseGenericDecl ),
+ _makeParseDecl("__extension", parseExtensionDecl ),
+ _makeParseDecl("extension", parseExtensionDecl ),
+ _makeParseDecl("__init", parseConstructorDecl ),
+ _makeParseDecl("__subscript", parseSubscriptDecl ),
+ _makeParseDecl("property", parsePropertyDecl ),
+ _makeParseDecl("interface", parseInterfaceDecl ),
+ _makeParseDecl("syntax", parseSyntaxDecl ),
+ _makeParseDecl("attribute_syntax", parseAttributeSyntaxDecl ),
+ _makeParseDecl("__import", parseImportDecl ),
+ _makeParseDecl("import", parseImportDecl ),
+ _makeParseDecl("let", parseLetDecl ),
+ _makeParseDecl("var", parseVarDecl ),
+ _makeParseDecl("func", parseFuncDecl ),
+ _makeParseDecl("typealias", parseTypeAliasDecl ),
+ _makeParseDecl("__generic_value_param", parseGlobalGenericValueParamDecl ),
+ _makeParseDecl("namespace", parseNamespaceDecl ),
+ _makeParseDecl("using", parseUsingDecl ),
+
+ // !!!!!!!!!!!!!!!!!!!!!! Modifer !!!!!!!!!!!!!!!!!!!!!!
// Add syntax for "simple" modifier keywords.
// These are the ones that just appear as a single
// keyword (no further tokens expected/allowed),
// and which can be represented just by creating
// a new AST node of the corresponding type.
- #define MODIFIER(KEYWORD, CLASS) \
- addSimpleModifierSyntax<CLASS>(session, scope, #KEYWORD)
-
- MODIFIER(in, InModifier);
- MODIFIER(input, InputModifier);
- MODIFIER(out, OutModifier);
- MODIFIER(inout, InOutModifier);
- MODIFIER(__ref, RefModifier);
- MODIFIER(const, ConstModifier);
- MODIFIER(instance, InstanceModifier);
- MODIFIER(__builtin, BuiltinModifier);
-
- MODIFIER(inline, InlineModifier);
- MODIFIER(public, PublicModifier);
- MODIFIER(require, RequireModifier);
- MODIFIER(param, ParamModifier);
- MODIFIER(extern, ExternModifier);
-
- MODIFIER(row_major, HLSLRowMajorLayoutModifier);
- MODIFIER(column_major, HLSLColumnMajorLayoutModifier);
-
- MODIFIER(nointerpolation, HLSLNoInterpolationModifier);
- MODIFIER(noperspective, HLSLNoPerspectiveModifier);
- MODIFIER(linear, HLSLLinearModifier);
- MODIFIER(sample, HLSLSampleModifier);
- MODIFIER(centroid, HLSLCentroidModifier);
- MODIFIER(precise, PreciseModifier);
- MODIFIER(shared, HLSLEffectSharedModifier);
- MODIFIER(groupshared, HLSLGroupSharedModifier);
- MODIFIER(static, HLSLStaticModifier);
- MODIFIER(uniform, HLSLUniformModifier);
- MODIFIER(volatile, HLSLVolatileModifier);
+
+ _makeParseModifier("in", InModifier::kReflectClassInfo),
+ _makeParseModifier("input", InputModifier::kReflectClassInfo),
+ _makeParseModifier("out", OutModifier::kReflectClassInfo),
+ _makeParseModifier("inout", InOutModifier::kReflectClassInfo),
+ _makeParseModifier("__ref", RefModifier::kReflectClassInfo),
+ _makeParseModifier("const", ConstModifier::kReflectClassInfo),
+ _makeParseModifier("instance", InstanceModifier::kReflectClassInfo),
+ _makeParseModifier("__builtin", BuiltinModifier::kReflectClassInfo),
+
+ _makeParseModifier("inline", InlineModifier::kReflectClassInfo),
+ _makeParseModifier("public", PublicModifier::kReflectClassInfo),
+ _makeParseModifier("require", RequireModifier::kReflectClassInfo),
+ _makeParseModifier("param", ParamModifier::kReflectClassInfo),
+ _makeParseModifier("extern", ExternModifier::kReflectClassInfo),
+
+ _makeParseModifier("row_major", HLSLRowMajorLayoutModifier::kReflectClassInfo),
+ _makeParseModifier("column_major", HLSLColumnMajorLayoutModifier::kReflectClassInfo),
+
+ _makeParseModifier("nointerpolation", HLSLNoInterpolationModifier::kReflectClassInfo),
+ _makeParseModifier("noperspective", HLSLNoPerspectiveModifier::kReflectClassInfo),
+ _makeParseModifier("linear", HLSLLinearModifier::kReflectClassInfo),
+ _makeParseModifier("sample", HLSLSampleModifier::kReflectClassInfo),
+ _makeParseModifier("centroid", HLSLCentroidModifier::kReflectClassInfo),
+ _makeParseModifier("precise", PreciseModifier::kReflectClassInfo),
+ _makeParseModifier("shared", HLSLEffectSharedModifier::kReflectClassInfo),
+ _makeParseModifier("groupshared", HLSLGroupSharedModifier::kReflectClassInfo),
+ _makeParseModifier("static", HLSLStaticModifier::kReflectClassInfo),
+ _makeParseModifier("uniform", HLSLUniformModifier::kReflectClassInfo),
+ _makeParseModifier("volatile", HLSLVolatileModifier::kReflectClassInfo),
// Modifiers for geometry shader input
- MODIFIER(point, HLSLPointModifier);
- MODIFIER(line, HLSLLineModifier);
- MODIFIER(triangle, HLSLTriangleModifier);
- MODIFIER(lineadj, HLSLLineAdjModifier);
- MODIFIER(triangleadj, HLSLTriangleAdjModifier);
+ _makeParseModifier("point", HLSLPointModifier::kReflectClassInfo),
+ _makeParseModifier("line", HLSLLineModifier::kReflectClassInfo),
+ _makeParseModifier("triangle", HLSLTriangleModifier::kReflectClassInfo),
+ _makeParseModifier("lineadj", HLSLLineAdjModifier::kReflectClassInfo),
+ _makeParseModifier("triangleadj", HLSLTriangleAdjModifier::kReflectClassInfo),
// Modifiers for unary operator declarations
- MODIFIER(__prefix, PrefixModifier);
- MODIFIER(__postfix, PostfixModifier);
+ _makeParseModifier("__prefix", PrefixModifier::kReflectClassInfo),
+ _makeParseModifier("__postfix", PostfixModifier::kReflectClassInfo),
// Modifier to apply to `import` that should be re-exported
- MODIFIER(__exported, ExportedModifier);
-
- #undef MODIFIER
+ _makeParseModifier("__exported", ExportedModifier::kReflectClassInfo),
// Add syntax for more complex modifiers, which allow
// or expect more tokens after the initial keyword.
- #define MODIFIER(KEYWORD, CALLBACK) \
- addBuiltinSyntax<Modifier>(session, scope, #KEYWORD, &CALLBACK)
- MODIFIER(layout, parseLayoutModifier);
+ _makeParseModifier("layout", parseLayoutModifier),
- MODIFIER(__intrinsic_op, parseIntrinsicOpModifier);
- MODIFIER(__target_intrinsic, parseTargetIntrinsicModifier);
- MODIFIER(__specialized_for_target, parseSpecializedForTargetModifier);
- MODIFIER(__glsl_extension, parseGLSLExtensionModifier);
- MODIFIER(__glsl_version, parseGLSLVersionModifier);
- MODIFIER(__spirv_version, parseSPIRVVersionModifier);
- MODIFIER(__cuda_sm_version, parseCUDASMVersionModifier);
+ _makeParseModifier("__intrinsic_op", parseIntrinsicOpModifier),
+ _makeParseModifier("__target_intrinsic", parseTargetIntrinsicModifier),
+ _makeParseModifier("__specialized_for_target", parseSpecializedForTargetModifier),
+ _makeParseModifier("__glsl_extension", parseGLSLExtensionModifier),
+ _makeParseModifier("__glsl_version", parseGLSLVersionModifier),
+ _makeParseModifier("__spirv_version", parseSPIRVVersionModifier),
+ _makeParseModifier("__cuda_sm_version", parseCUDASMVersionModifier),
- MODIFIER(__builtin_type, parseBuiltinTypeModifier);
- MODIFIER(__magic_type, parseMagicTypeModifier);
- MODIFIER(__intrinsic_type, parseIntrinsicTypeModifier);
- MODIFIER(__implicit_conversion, parseImplicitConversionModifier);
+ _makeParseModifier("__builtin_type", parseBuiltinTypeModifier),
+ _makeParseModifier("__magic_type", parseMagicTypeModifier),
+ _makeParseModifier("__intrinsic_type", parseIntrinsicTypeModifier),
+ _makeParseModifier("__implicit_conversion", parseImplicitConversionModifier),
- MODIFIER(__attributeTarget, parseAttributeTargetModifier);
+ _makeParseModifier("__attributeTarget", parseAttributeTargetModifier),
+ // !!!!!!!!!!!!!!!!!!!!!!! Expr !!!!!!!!!!!!!!!!!!!!!!!!!!!
-#undef MODIFIER
+ _makeParseExpr("this", parseThisExpr),
+ _makeParseExpr("This", parseThisTypeExpr),
+ _makeParseExpr("true", parseTrueExpr),
+ _makeParseExpr("false", parseFalseExpr),
+ _makeParseExpr("__TaggedUnion", parseTaggedUnionType),
+ };
- // Add syntax for expression keywords
- #define EXPR(KEYWORD, CALLBACK) \
- addBuiltinSyntax<Expr>(session, scope, #KEYWORD, &CALLBACK)
+ ConstArrayView<SyntaxParseInfo> getSyntaxParseInfos()
+ {
+ return makeConstArrayView(g_parseSyntaxEntries, SLANG_COUNT_OF(g_parseSyntaxEntries));
+ }
- EXPR(this, parseThisExpr);
- EXPR(This, parseThisTypeExpr);
- EXPR(true, parseTrueExpr);
- EXPR(false, parseFalseExpr);
- EXPR(__TaggedUnion, parseTaggedUnionType);
+ ModuleDecl* populateBaseLanguageModule(
+ ASTBuilder* astBuilder,
+ RefPtr<Scope> scope)
+ {
+ Session* session = astBuilder->getGlobalSession();
- #undef EXPR
+ ModuleDecl* moduleDecl = astBuilder->create<ModuleDecl>();
+ scope->containerDecl = moduleDecl;
+ // Add syntax for declaration keywords
+ for (const auto& info : getSyntaxParseInfos())
+ {
+ addBuiltinSyntaxImpl(session, scope, info.keywordName, info.callback, const_cast<ReflectClassInfo*>(info.classInfo), info.classInfo);
+ }
+
return moduleDecl;
}