From 0c3607579e476328b132d320df17db685e870db1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 2 Mar 2022 13:15:12 +0100 Subject: [PATCH] Shader/ShaderLangParser: small refactor --- include/Nazara/Shader/ShaderLangParser.hpp | 1 + src/Nazara/Shader/ShaderLangParser.cpp | 128 +++++++++------------ 2 files changed, 53 insertions(+), 76 deletions(-) diff --git a/include/Nazara/Shader/ShaderLangParser.hpp b/include/Nazara/Shader/ShaderLangParser.hpp index 34b6bb15d..b24c4184a 100644 --- a/include/Nazara/Shader/ShaderLangParser.hpp +++ b/include/Nazara/Shader/ShaderLangParser.hpp @@ -96,6 +96,7 @@ namespace Nz::ShaderLang void ParseModuleStatement(std::vector attributes); ShaderAst::StatementPtr ParseOptionDeclaration(); ShaderAst::StatementPtr ParseReturnStatement(); + ShaderAst::StatementPtr ParseRootStatement(std::vector attributes = {}); ShaderAst::StatementPtr ParseSingleStatement(); ShaderAst::StatementPtr ParseStatement(); std::vector ParseStatementList(); diff --git a/src/Nazara/Shader/ShaderLangParser.cpp b/src/Nazara/Shader/ShaderLangParser.cpp index e89ff77f7..ca5e498e8 100644 --- a/src/Nazara/Shader/ShaderLangParser.cpp +++ b/src/Nazara/Shader/ShaderLangParser.cpp @@ -118,87 +118,16 @@ namespace Nz::ShaderLang std::vector attributes; - auto EnsureModule = [this]() -> ShaderAst::Module& + for (;;) { + ShaderAst::StatementPtr statement = ParseRootStatement(); if (!m_context->module) throw UnexpectedToken{ "unexpected token before module declaration" }; - return *m_context->module; - }; + if (!statement) + break; - bool reachedEndOfStream = false; - while (!reachedEndOfStream) - { - const Token& nextToken = Peek(); - switch (nextToken.type) - { - case TokenType::Const: - { - if (!attributes.empty()) - throw UnexpectedToken{}; - - const auto& module = EnsureModule(); - module.rootNode->statements.push_back(ParseConstStatement()); - break; - } - - case TokenType::EndOfStream: - if (!attributes.empty()) - throw UnexpectedToken{}; - - reachedEndOfStream = true; - break; - - case TokenType::External: - { - const auto& module = EnsureModule(); - module.rootNode->statements.push_back(ParseExternalBlock(std::move(attributes))); - attributes.clear(); - break; - } - - case TokenType::OpenSquareBracket: - assert(attributes.empty()); - attributes = ParseAttributes(); - break; - - case TokenType::Module: - if (attributes.empty()) - throw UnexpectedToken{}; - - ParseModuleStatement(std::move(attributes)); - attributes.clear(); - break; - - case TokenType::Option: - { - if (!attributes.empty()) - throw UnexpectedToken{}; - - const auto& module = EnsureModule(); - module.rootNode->statements.push_back(ParseOptionDeclaration()); - break; - } - - case TokenType::FunctionDeclaration: - { - const auto& module = EnsureModule(); - module.rootNode->statements.push_back(ParseFunctionDeclaration(std::move(attributes))); - attributes.clear(); - break; - } - - case TokenType::Struct: - { - const auto& module = EnsureModule(); - module.rootNode->statements.push_back(ParseStructDeclaration(std::move(attributes))); - attributes.clear(); - break; - } - - default: - throw UnexpectedToken{}; - } + m_context->module->rootNode->statements.push_back(std::move(statement)); } return std::move(context.module); @@ -739,6 +668,53 @@ namespace Nz::ShaderLang return ShaderBuilder::Return(std::move(expr)); } + ShaderAst::StatementPtr Parser::ParseRootStatement(std::vector attributes) + { + const Token& nextToken = Peek(); + switch (nextToken.type) + { + case TokenType::Const: + if (!attributes.empty()) + throw UnexpectedToken{}; + + return ParseConstStatement(); + + case TokenType::EndOfStream: + if (!attributes.empty()) + throw UnexpectedToken{}; + + return {}; + + case TokenType::External: + return ParseExternalBlock(std::move(attributes)); + + case TokenType::OpenSquareBracket: + assert(attributes.empty()); + return ParseRootStatement(ParseAttributes()); + + case TokenType::Module: + ParseModuleStatement(std::move(attributes)); + return ParseRootStatement(); + + case TokenType::Option: + { + if (!attributes.empty()) + throw UnexpectedToken{}; + + return ParseOptionDeclaration(); + } + + case TokenType::FunctionDeclaration: + return ParseFunctionDeclaration(std::move(attributes)); + + case TokenType::Struct: + return ParseStructDeclaration(std::move(attributes)); + + default: + throw UnexpectedToken{}; + } + } + ShaderAst::StatementPtr Parser::ParseSingleStatement() { std::vector attributes;