ShaderLang: Improve lexer

This commit is contained in:
Jérôme Leclercq 2021-03-11 23:20:22 +01:00
parent da81a5b871
commit 5598487e87
1 changed files with 25 additions and 16 deletions

View File

@ -100,6 +100,7 @@ namespace Nz::ShaderLang
{ {
if (Peek() == '>') if (Peek() == '>')
{ {
currentPos++;
tokenType = TokenType::FunctionReturn; tokenType = TokenType::FunctionReturn;
break; break;
} }
@ -225,7 +226,10 @@ namespace Nz::ShaderLang
{ {
char next = Peek(); char next = Peek();
if (next == '[') if (next == '[')
{
currentPos++;
tokenType = TokenType::OpenAttribute; tokenType = TokenType::OpenAttribute;
}
else else
tokenType = TokenType::OpenSquareBracket; tokenType = TokenType::OpenSquareBracket;
@ -236,7 +240,10 @@ namespace Nz::ShaderLang
{ {
char next = Peek(); char next = Peek();
if (next == ']') if (next == ']')
{
currentPos++;
tokenType = TokenType::ClosingAttribute; tokenType = TokenType::ClosingAttribute;
}
else else
tokenType = TokenType::ClosingSquareBracket; tokenType = TokenType::ClosingSquareBracket;
@ -255,26 +262,28 @@ namespace Nz::ShaderLang
case '(': tokenType = TokenType::OpenParenthesis; break; case '(': tokenType = TokenType::OpenParenthesis; break;
case ')': tokenType = TokenType::ClosingParenthesis; break; case ')': tokenType = TokenType::ClosingParenthesis; break;
default: break; default:
}
if (!tokenType)
{
if (IsAlphaNum(c))
{ {
std::size_t start = currentPos; if (IsAlphaNum(c))
while (IsAlphaNum(Peek()))
currentPos++;
std::string identifier(str.substr(start, currentPos - start + 1));
if (auto it = reservedKeywords.find(identifier); it == reservedKeywords.end())
{ {
tokenType = TokenType::Identifier; std::size_t start = currentPos;
token.data = std::move(identifier);
while (IsAlphaNum(Peek()))
currentPos++;
std::string identifier(str.substr(start, currentPos - start + 1));
if (auto it = reservedKeywords.find(identifier); it == reservedKeywords.end())
{
tokenType = TokenType::Identifier;
token.data = std::move(identifier);
}
else
tokenType = it->second;
break;
} }
else else
tokenType = it->second; throw UnrecognizedToken{};
} }
} }