Shader: Fix some errors
This commit is contained in:
parent
1afc599e3d
commit
35f6240786
|
|
@ -85,6 +85,10 @@ namespace Nz::ShaderLang
|
||||||
std::string ParseModuleName();
|
std::string ParseModuleName();
|
||||||
ShaderAst::ExpressionPtr ParseType();
|
ShaderAst::ExpressionPtr ParseType();
|
||||||
|
|
||||||
|
template<typename T> void HandleUniqueAttribute(ShaderAst::ExpressionValue<T>& targetAttribute, Attribute&& attribute);
|
||||||
|
template<typename T> void HandleUniqueAttribute(ShaderAst::ExpressionValue<T>& targetAttribute, Attribute&& attribute, T defaultValue);
|
||||||
|
template<typename T> void HandleUniqueStringAttribute(ShaderAst::ExpressionValue<T>& targetAttribute, Attribute&& attribute, const std::unordered_map<std::string, T>& map, std::optional<T> defaultValue = {});
|
||||||
|
|
||||||
static int GetTokenPrecedence(TokenType token);
|
static int GetTokenPrecedence(TokenType token);
|
||||||
|
|
||||||
struct Context
|
struct Context
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ namespace Nz::ShaderLang
|
||||||
assert(rightLocation.endLine >= startLine);
|
assert(rightLocation.endLine >= startLine);
|
||||||
endLine = rightLocation.endLine;
|
endLine = rightLocation.endLine;
|
||||||
assert(rightLocation.endLine > startLine || rightLocation.endColumn >= startColumn);
|
assert(rightLocation.endLine > startLine || rightLocation.endColumn >= startColumn);
|
||||||
endColumn = endColumn;
|
endColumn = rightLocation.endColumn;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline SourceLocation SourceLocation::BuildFromTo(const SourceLocation& leftSource, const SourceLocation& rightSource)
|
inline SourceLocation SourceLocation::BuildFromTo(const SourceLocation& leftSource, const SourceLocation& rightSource)
|
||||||
|
|
|
||||||
|
|
@ -424,7 +424,6 @@ namespace Nz::ShaderAst
|
||||||
auto clone = std::make_unique<CastExpression>();
|
auto clone = std::make_unique<CastExpression>();
|
||||||
clone->targetType = Clone(node.targetType);
|
clone->targetType = Clone(node.targetType);
|
||||||
|
|
||||||
for (auto& expr : node.expressions)
|
|
||||||
for (std::size_t expressionIndex = 0; expressionIndex < node.expressions.size(); ++expressionIndex)
|
for (std::size_t expressionIndex = 0; expressionIndex < node.expressions.size(); ++expressionIndex)
|
||||||
{
|
{
|
||||||
auto& expr = node.expressions[expressionIndex];
|
auto& expr = node.expressions[expressionIndex];
|
||||||
|
|
|
||||||
|
|
@ -870,6 +870,7 @@ namespace Nz::ShaderAst
|
||||||
type = ShaderAst::Type{
|
type = ShaderAst::Type{
|
||||||
containedTypeIndex
|
containedTypeIndex
|
||||||
};
|
};
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 10: //< FunctionType
|
case 10: //< FunctionType
|
||||||
|
|
@ -880,6 +881,7 @@ namespace Nz::ShaderAst
|
||||||
type = FunctionType {
|
type = FunctionType {
|
||||||
funcIndex
|
funcIndex
|
||||||
};
|
};
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 11: //< IntrinsicFunctionType
|
case 11: //< IntrinsicFunctionType
|
||||||
|
|
@ -890,6 +892,7 @@ namespace Nz::ShaderAst
|
||||||
type = IntrinsicFunctionType {
|
type = IntrinsicFunctionType {
|
||||||
intrinsicType
|
intrinsicType
|
||||||
};
|
};
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 12: //< MethodType
|
case 12: //< MethodType
|
||||||
|
|
@ -906,6 +909,7 @@ namespace Nz::ShaderAst
|
||||||
methodType.methodIndex = methodIndex;
|
methodType.methodIndex = methodIndex;
|
||||||
|
|
||||||
type = std::move(methodType);
|
type = std::move(methodType);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 13: //< AliasType
|
case 13: //< AliasType
|
||||||
|
|
|
||||||
|
|
@ -58,59 +58,6 @@ namespace Nz::ShaderLang
|
||||||
{ "hint", ShaderAst::LoopUnroll::Hint },
|
{ "hint", ShaderAst::LoopUnroll::Hint },
|
||||||
{ "never", ShaderAst::LoopUnroll::Never }
|
{ "never", ShaderAst::LoopUnroll::Never }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void HandleUniqueAttribute(ShaderAst::ExpressionValue<T>& targetAttribute, Parser::Attribute&& attribute)
|
|
||||||
{
|
|
||||||
if (targetAttribute.HasValue())
|
|
||||||
throw ParserAttributeMultipleUniqueError{ attribute.sourceLocation, attribute.type };
|
|
||||||
|
|
||||||
if (!attribute.args)
|
|
||||||
throw ParserAttributeMissingParameterError{ attribute.sourceLocation, attribute.type };
|
|
||||||
|
|
||||||
targetAttribute = std::move(attribute.args);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void HandleUniqueAttribute(ShaderAst::ExpressionValue<T>& targetAttribute, Parser::Attribute&& attribute, T defaultValue)
|
|
||||||
{
|
|
||||||
if (targetAttribute.HasValue())
|
|
||||||
throw ParserAttributeMultipleUniqueError{ attribute.sourceLocation, attribute.type };
|
|
||||||
|
|
||||||
if (attribute.args)
|
|
||||||
targetAttribute = std::move(attribute.args);
|
|
||||||
else
|
|
||||||
targetAttribute = std::move(defaultValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void HandleUniqueStringAttribute(ShaderAst::ExpressionValue<T>& targetAttribute, Parser::Attribute&& attribute, const std::unordered_map<std::string, T>& map, std::optional<T> defaultValue = {})
|
|
||||||
{
|
|
||||||
if (targetAttribute.HasValue())
|
|
||||||
throw ParserAttributeMultipleUniqueError{ attribute.sourceLocation, attribute.type };
|
|
||||||
|
|
||||||
//FIXME: This should be handled with global values at sanitization stage
|
|
||||||
if (attribute.args)
|
|
||||||
{
|
|
||||||
if (attribute.args->GetType() != ShaderAst::NodeType::IdentifierExpression)
|
|
||||||
throw ParserAttributeParameterIdentifierError{ attribute.args->sourceLocation, attribute.type };
|
|
||||||
|
|
||||||
const std::string& exprStr = static_cast<ShaderAst::IdentifierExpression&>(*attribute.args).identifier;
|
|
||||||
|
|
||||||
auto it = map.find(exprStr);
|
|
||||||
if (it == map.end())
|
|
||||||
throw ParserAttributeInvalidParameterError{ attribute.args->sourceLocation, exprStr, attribute.type };
|
|
||||||
|
|
||||||
targetAttribute = it->second;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!defaultValue)
|
|
||||||
throw ParserAttributeMissingParameterError{ attribute.sourceLocation, attribute.type };
|
|
||||||
|
|
||||||
targetAttribute = defaultValue.value();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderAst::ModulePtr Parser::Parse(const std::vector<Token>& tokens)
|
ShaderAst::ModulePtr Parser::Parse(const std::vector<Token>& tokens)
|
||||||
|
|
@ -1524,6 +1471,59 @@ namespace Nz::ShaderLang
|
||||||
return ParseExpression();
|
return ParseExpression();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void Parser::HandleUniqueAttribute(ShaderAst::ExpressionValue<T>& targetAttribute, Parser::Attribute&& attribute)
|
||||||
|
{
|
||||||
|
if (targetAttribute.HasValue())
|
||||||
|
throw ParserAttributeMultipleUniqueError{ attribute.sourceLocation, attribute.type };
|
||||||
|
|
||||||
|
if (!attribute.args)
|
||||||
|
throw ParserAttributeMissingParameterError{ attribute.sourceLocation, attribute.type };
|
||||||
|
|
||||||
|
targetAttribute = std::move(attribute.args);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void Parser::HandleUniqueAttribute(ShaderAst::ExpressionValue<T>& targetAttribute, Parser::Attribute&& attribute, T defaultValue)
|
||||||
|
{
|
||||||
|
if (targetAttribute.HasValue())
|
||||||
|
throw ParserAttributeMultipleUniqueError{ attribute.sourceLocation, attribute.type };
|
||||||
|
|
||||||
|
if (attribute.args)
|
||||||
|
targetAttribute = std::move(attribute.args);
|
||||||
|
else
|
||||||
|
targetAttribute = std::move(defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void Parser::HandleUniqueStringAttribute(ShaderAst::ExpressionValue<T>& targetAttribute, Parser::Attribute&& attribute, const std::unordered_map<std::string, T>& map, std::optional<T> defaultValue)
|
||||||
|
{
|
||||||
|
if (targetAttribute.HasValue())
|
||||||
|
throw ParserAttributeMultipleUniqueError{ attribute.sourceLocation, attribute.type };
|
||||||
|
|
||||||
|
//FIXME: This should be handled with global values at sanitization stage
|
||||||
|
if (attribute.args)
|
||||||
|
{
|
||||||
|
if (attribute.args->GetType() != ShaderAst::NodeType::IdentifierExpression)
|
||||||
|
throw ParserAttributeParameterIdentifierError{ attribute.args->sourceLocation, attribute.type };
|
||||||
|
|
||||||
|
const std::string& exprStr = static_cast<ShaderAst::IdentifierExpression&>(*attribute.args).identifier;
|
||||||
|
|
||||||
|
auto it = map.find(exprStr);
|
||||||
|
if (it == map.end())
|
||||||
|
throw ParserAttributeInvalidParameterError{ attribute.args->sourceLocation, exprStr, attribute.type };
|
||||||
|
|
||||||
|
targetAttribute = it->second;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!defaultValue)
|
||||||
|
throw ParserAttributeMissingParameterError{ attribute.sourceLocation, attribute.type };
|
||||||
|
|
||||||
|
targetAttribute = defaultValue.value();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int Parser::GetTokenPrecedence(TokenType token)
|
int Parser::GetTokenPrecedence(TokenType token)
|
||||||
{
|
{
|
||||||
switch (token)
|
switch (token)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue