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:
parent
080cdc1737
commit
1cc1a2813e
7 changed files with 190 additions and 8 deletions
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue