Shader: Add support for while loops

This commit is contained in:
Jérôme Leclercq
2021-12-16 23:10:58 +01:00
parent 07199301df
commit 0f9060c45b
22 changed files with 154 additions and 14 deletions

View File

@@ -742,6 +742,10 @@ namespace Nz::ShaderLang
statement = ParseReturnStatement();
break;
case TokenType::While:
statement = ParseWhileStatement();
break;
default:
throw UnexpectedToken{};
}
@@ -905,6 +909,21 @@ namespace Nz::ShaderLang
return ShaderBuilder::DeclareVariable(std::move(variableName), std::move(variableType), std::move(expression));
}
ShaderAst::StatementPtr Parser::ParseWhileStatement()
{
Expect(Advance(), TokenType::While);
Expect(Advance(), TokenType::OpenParenthesis);
ShaderAst::ExpressionPtr condition = ParseExpression();
Expect(Advance(), TokenType::ClosingParenthesis);
ShaderAst::StatementPtr body = ParseStatement();
return ShaderBuilder::While(std::move(condition), std::move(body));
}
ShaderAst::ExpressionPtr Parser::ParseBinOpRhs(int exprPrecedence, ShaderAst::ExpressionPtr lhs)
{
for (;;)