Shader/LangParser: OCD fix

This commit is contained in:
Jérôme Leclercq 2021-09-23 17:49:36 +02:00
parent 3ad05614f9
commit ea49f56530
2 changed files with 80 additions and 80 deletions

View File

@ -92,11 +92,11 @@ namespace Nz::ShaderLang
ShaderAst::StatementPtr ParseFunctionDeclaration(std::vector<ShaderAst::Attribute> attributes = {}); ShaderAst::StatementPtr ParseFunctionDeclaration(std::vector<ShaderAst::Attribute> attributes = {});
ShaderAst::DeclareFunctionStatement::Parameter ParseFunctionParameter(); ShaderAst::DeclareFunctionStatement::Parameter ParseFunctionParameter();
ShaderAst::StatementPtr ParseOptionDeclaration(); ShaderAst::StatementPtr ParseOptionDeclaration();
ShaderAst::StatementPtr ParseStructDeclaration(std::vector<ShaderAst::Attribute> attributes = {});
ShaderAst::StatementPtr ParseReturnStatement(); ShaderAst::StatementPtr ParseReturnStatement();
ShaderAst::StatementPtr ParseSingleStatement(); ShaderAst::StatementPtr ParseSingleStatement();
ShaderAst::StatementPtr ParseStatement(); ShaderAst::StatementPtr ParseStatement();
std::vector<ShaderAst::StatementPtr> ParseStatementList(); std::vector<ShaderAst::StatementPtr> ParseStatementList();
ShaderAst::StatementPtr ParseStructDeclaration(std::vector<ShaderAst::Attribute> attributes = {});
ShaderAst::StatementPtr ParseVariableDeclaration(); ShaderAst::StatementPtr ParseVariableDeclaration();
// Expressions // Expressions

View File

@ -694,6 +694,85 @@ namespace Nz::ShaderLang
return ShaderBuilder::DeclareOption(std::move(optionName), std::move(optionType), std::move(initialValue)); 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<ShaderAst::StatementPtr> Parser::ParseStatementList()
{
EnterScope();
Expect(Advance(), TokenType::OpenCurlyBracket);
std::vector<ShaderAst::StatementPtr> 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<ShaderAst::Attribute> attributes) ShaderAst::StatementPtr Parser::ParseStructDeclaration(std::vector<ShaderAst::Attribute> attributes)
{ {
Expect(Advance(), TokenType::Struct); Expect(Advance(), TokenType::Struct);
@ -779,85 +858,6 @@ namespace Nz::ShaderLang
return ShaderBuilder::DeclareStruct(std::move(description)); 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<ShaderAst::StatementPtr> Parser::ParseStatementList()
{
EnterScope();
Expect(Advance(), TokenType::OpenCurlyBracket);
std::vector<ShaderAst::StatementPtr> 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 Parser::ParseVariableAssignation()
{ {
ShaderAst::ExpressionPtr left = ParseExpression(); ShaderAst::ExpressionPtr left = ParseExpression();