MCParser: add a single token lookahead

Some of the more complex directive and macro handling for GAS compatibility
requires lookahead.  Add a single token lookahead in the MCAsmLexer.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201058 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Saleem Abdulrasool 2014-02-09 23:29:24 +00:00
parent a4122f4746
commit 537dca94b3
3 changed files with 27 additions and 0 deletions

View File

@ -47,6 +47,8 @@ public:
virtual StringRef LexUntilEndOfStatement();
StringRef LexUntilEndOfLine();
virtual const AsmToken peekTok(bool ShouldSkipSpace = true);
bool isAtStartOfComment(char Char);
bool isAtStatementSeparator(const char *Ptr);

View File

@ -160,6 +160,9 @@ public:
return CurTok;
}
/// peekTok - Look ahead at the next token to be lexed.
virtual const AsmToken peekTok(bool ShouldSkipSpace = true) = 0;
/// getErrLoc - Get the current error location
const SMLoc &getErrLoc() {
return ErrLoc;

View File

@ -439,6 +439,28 @@ StringRef AsmLexer::LexUntilEndOfLine() {
return StringRef(TokStart, CurPtr-TokStart);
}
const AsmToken AsmLexer::peekTok(bool ShouldSkipSpace) {
const char *SavedTokStart = TokStart;
const char *SavedCurPtr = CurPtr;
bool SavedAtStartOfLine = isAtStartOfLine;
bool SavedSkipSpace = SkipSpace;
std::string SavedErr = getErr();
SMLoc SavedErrLoc = getErrLoc();
SkipSpace = ShouldSkipSpace;
AsmToken Token = LexToken();
SetError(SavedErrLoc, SavedErr);
SkipSpace = SavedSkipSpace;
isAtStartOfLine = SavedAtStartOfLine;
CurPtr = SavedCurPtr;
TokStart = SavedTokStart;
return Token;
}
bool AsmLexer::isAtStartOfComment(char Char) {
// FIXME: This won't work for multi-character comment indicators like "//".
return Char == *MAI.getCommentString();