HLSL: 1) Implement lookahead buffers/stacks for token advance/recede, 2) use it for cast operation.

The grammar now accepts type casts, like "(int)x", but that
has to be disambiguated from "(a + b)", needed deeper lookahead
and backing up than what existed so far.
This commit is contained in:
John Kessenich 2016-06-03 16:55:49 -06:00
parent 080cdc1737
commit 1cc1a2813e
7 changed files with 190 additions and 8 deletions

View file

@ -37,10 +37,45 @@
namespace glslang {
void HlslTokenStream::pushPreToken(const HlslToken& tok)
{
assert(preTokenStackSize == 0);
preTokenStack = tok;
++preTokenStackSize;
}
HlslToken HlslTokenStream::popPreToken()
{
assert(preTokenStackSize == 1);
--preTokenStackSize;
return preTokenStack;
}
void HlslTokenStream::pushTokenBuffer(const HlslToken& tok)
{
tokenBuffer = tok;
}
HlslToken HlslTokenStream::popTokenBuffer()
{
return tokenBuffer;
}
// Load 'token' with the next token in the stream of tokens.
void HlslTokenStream::advanceToken()
{
scanner.tokenize(token);
pushTokenBuffer(token);
if (preTokenStackSize > 0)
token = popPreToken();
else
scanner.tokenize(token);
}
void HlslTokenStream::recedeToken()
{
pushPreToken(token);
token = popTokenBuffer();
}
// Return the current token class.