diff --git a/include/Nazara/Shader/ShaderLangParser.hpp b/include/Nazara/Shader/ShaderLangParser.hpp index f86e1625a..022fd3521 100644 --- a/include/Nazara/Shader/ShaderLangParser.hpp +++ b/include/Nazara/Shader/ShaderLangParser.hpp @@ -92,11 +92,11 @@ namespace Nz::ShaderLang ShaderAst::StatementPtr ParseFunctionDeclaration(std::vector attributes = {}); ShaderAst::DeclareFunctionStatement::Parameter ParseFunctionParameter(); ShaderAst::StatementPtr ParseOptionDeclaration(); - ShaderAst::StatementPtr ParseStructDeclaration(std::vector attributes = {}); ShaderAst::StatementPtr ParseReturnStatement(); ShaderAst::StatementPtr ParseSingleStatement(); ShaderAst::StatementPtr ParseStatement(); std::vector ParseStatementList(); + ShaderAst::StatementPtr ParseStructDeclaration(std::vector attributes = {}); ShaderAst::StatementPtr ParseVariableDeclaration(); // Expressions diff --git a/src/Nazara/Shader/ShaderLangParser.cpp b/src/Nazara/Shader/ShaderLangParser.cpp index e1e7ac4e6..69afd058c 100644 --- a/src/Nazara/Shader/ShaderLangParser.cpp +++ b/src/Nazara/Shader/ShaderLangParser.cpp @@ -694,6 +694,85 @@ namespace Nz::ShaderLang return ShaderBuilder::DeclareOption(std::move(optionName), std::move(optionType), std::move(initialValue)); } + ShaderAst::StatementPtr Parser::ParseReturnStatement() + { + Expect(Advance(), TokenType::Return); + + ShaderAst::ExpressionPtr expr; + if (Peek().type != TokenType::Semicolon) + expr = ParseExpression(); + + Expect(Advance(), TokenType::Semicolon); + + return ShaderBuilder::Return(std::move(expr)); + } + + ShaderAst::StatementPtr Parser::ParseSingleStatement() + { + const Token& token = Peek(); + + ShaderAst::StatementPtr statement; + switch (token.type) + { + case TokenType::Const: + statement = ParseConstStatement(); + break; + + case TokenType::Discard: + statement = ParseDiscardStatement(); + break; + + case TokenType::Let: + statement = ParseVariableDeclaration(); + break; + + case TokenType::Identifier: + statement = ShaderBuilder::ExpressionStatement(ParseVariableAssignation()); + Expect(Advance(), TokenType::Semicolon); + break; + + case TokenType::If: + statement = ParseBranchStatement(); + break; + + case TokenType::Return: + statement = ParseReturnStatement(); + break; + + default: + break; + } + + return statement; + } + + ShaderAst::StatementPtr Parser::ParseStatement() + { + if (Peek().type == TokenType::OpenCurlyBracket) + return ShaderBuilder::MultiStatement(ParseStatementList()); + else + return ParseSingleStatement(); + } + + std::vector Parser::ParseStatementList() + { + EnterScope(); + + Expect(Advance(), TokenType::OpenCurlyBracket); + + std::vector statements; + while (Peek().type != TokenType::ClosingCurlyBracket) + { + ExpectNot(Peek(), TokenType::EndOfStream); + statements.push_back(ParseStatement()); + } + Consume(); //< Consume closing curly bracket + + LeaveScope(); + + return statements; + } + ShaderAst::StatementPtr Parser::ParseStructDeclaration(std::vector attributes) { Expect(Advance(), TokenType::Struct); @@ -779,85 +858,6 @@ namespace Nz::ShaderLang return ShaderBuilder::DeclareStruct(std::move(description)); } - ShaderAst::StatementPtr Parser::ParseReturnStatement() - { - Expect(Advance(), TokenType::Return); - - ShaderAst::ExpressionPtr expr; - if (Peek().type != TokenType::Semicolon) - expr = ParseExpression(); - - Expect(Advance(), TokenType::Semicolon); - - return ShaderBuilder::Return(std::move(expr)); - } - - ShaderAst::StatementPtr Parser::ParseSingleStatement() - { - const Token& token = Peek(); - - ShaderAst::StatementPtr statement; - switch (token.type) - { - case TokenType::Const: - statement = ParseConstStatement(); - break; - - case TokenType::Discard: - statement = ParseDiscardStatement(); - break; - - case TokenType::Let: - statement = ParseVariableDeclaration(); - break; - - case TokenType::Identifier: - statement = ShaderBuilder::ExpressionStatement(ParseVariableAssignation()); - Expect(Advance(), TokenType::Semicolon); - break; - - case TokenType::If: - statement = ParseBranchStatement(); - break; - - case TokenType::Return: - statement = ParseReturnStatement(); - break; - - default: - break; - } - - return statement; - } - - ShaderAst::StatementPtr Parser::ParseStatement() - { - if (Peek().type == TokenType::OpenCurlyBracket) - return ShaderBuilder::MultiStatement(ParseStatementList()); - else - return ParseSingleStatement(); - } - - std::vector Parser::ParseStatementList() - { - EnterScope(); - - Expect(Advance(), TokenType::OpenCurlyBracket); - - std::vector statements; - while (Peek().type != TokenType::ClosingCurlyBracket) - { - ExpectNot(Peek(), TokenType::EndOfStream); - statements.push_back(ParseStatement()); - } - Consume(); //< Consume closing curly bracket - - LeaveScope(); - - return statements; - } - ShaderAst::ExpressionPtr Parser::ParseVariableAssignation() { ShaderAst::ExpressionPtr left = ParseExpression();