summaryrefslogtreecommitdiff
path: root/source/slang/lexer.h
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2019-02-05 18:47:55 -0800
committerGitHub <noreply@github.com>2019-02-05 18:47:55 -0800
commitc6870dcbf6f720bfbfe7e38f7d9625d69bedde3d (patch)
treea81b861c6cbd345e323a1f5ee3bc4eec61646b96 /source/slang/lexer.h
parent13d7e34d8be4316c59bd3d00a1e5526215db6fa4 (diff)
parent3d62beab61490ce3e7ed60b48fd6a11c8eeb44ad (diff)
Merge branch 'master' into fix-nested-type-conformances
Diffstat (limited to 'source/slang/lexer.h')
-rw-r--r--source/slang/lexer.h24
1 files changed, 22 insertions, 2 deletions
diff --git a/source/slang/lexer.h b/source/slang/lexer.h
index 593e07c22..8587cc904 100644
--- a/source/slang/lexer.h
+++ b/source/slang/lexer.h
@@ -38,18 +38,37 @@ namespace Slang
struct TokenReader
{
+ Token nextToken;
TokenReader();
explicit TokenReader(TokenSpan const& tokens)
: mCursor(tokens.begin())
, mEnd (tokens.end ())
+ , nextToken(tokens.begin() ? *tokens.begin() : GetEndOfFileToken())
{}
explicit TokenReader(TokenList const& tokens)
: mCursor(tokens.begin())
, mEnd (tokens.end ())
+ , nextToken(tokens.begin() ? *tokens.begin() : GetEndOfFileToken())
{}
-
+ struct ParsingCursor
+ {
+ Token nextToken;
+ Token* tokenReaderCursor = nullptr;
+ };
+ ParsingCursor getCursor()
+ {
+ ParsingCursor rs;
+ rs.nextToken = nextToken;
+ rs.tokenReaderCursor = mCursor;
+ return rs;
+ }
+ void setCursor(ParsingCursor cursor)
+ {
+ mCursor = cursor.tokenReaderCursor;
+ nextToken = cursor.nextToken;
+ }
bool IsAtEnd() const { return mCursor == mEnd; }
- Token PeekToken() const;
+ Token& PeekToken();
TokenType PeekTokenType() const;
SourceLoc PeekLoc() const;
@@ -59,6 +78,7 @@ namespace Slang
Token* mCursor;
Token* mEnd;
+ static Token GetEndOfFileToken();
};
typedef unsigned int LexerFlags;