MIR Parser: adopt the 'maybeLex...' pattern. NFC.

This commit refactors the machine instruction lexer so that the lexing
functions use the 'maybeLex...' pattern, where they determine if they
can lex the current token by themselves.

Reviewers: Sean Silva

Differential Revision: http://reviews.llvm.org/D10817


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241078 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alex Lorenz
2015-06-30 16:51:29 +00:00
parent 5601e30a77
commit 1991c597a4

View File

@ -26,6 +26,8 @@ class Cursor {
const char *End; const char *End;
public: public:
Cursor(NoneType) : Ptr(nullptr), End(nullptr) {}
explicit Cursor(StringRef Str) { explicit Cursor(StringRef Str) {
Ptr = Str.data(); Ptr = Str.data();
End = Ptr + Str.size(); End = Ptr + Str.size();
@ -45,6 +47,8 @@ public:
} }
StringRef::iterator location() const { return Ptr; } StringRef::iterator location() const { return Ptr; }
operator bool() const { return Ptr != nullptr; }
}; };
} // end anonymous namespace } // end anonymous namespace
@ -60,7 +64,9 @@ static bool isIdentifierChar(char C) {
return isalpha(C) || isdigit(C) || C == '_' || C == '-' || C == '.'; return isalpha(C) || isdigit(C) || C == '_' || C == '-' || C == '.';
} }
static Cursor lexIdentifier(Cursor C, MIToken &Token) { static Cursor maybeLexIdentifier(Cursor C, MIToken &Token) {
if (!isalpha(C.peek()) && C.peek() != '_')
return None;
auto Range = C; auto Range = C;
while (isIdentifierChar(C.peek())) while (isIdentifierChar(C.peek()))
C.advance(); C.advance();
@ -70,9 +76,11 @@ static Cursor lexIdentifier(Cursor C, MIToken &Token) {
return C; return C;
} }
static Cursor lexMachineBasicBlock( static Cursor maybeLexMachineBasicBlock(
Cursor C, MIToken &Token, Cursor C, MIToken &Token,
function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) {
if (!C.remaining().startswith("%bb."))
return None;
auto Range = C; auto Range = C;
C.advance(4); // Skip '%bb.' C.advance(4); // Skip '%bb.'
if (!isdigit(C.peek())) { if (!isdigit(C.peek())) {
@ -96,7 +104,9 @@ static Cursor lexMachineBasicBlock(
return C; return C;
} }
static Cursor lexPercent(Cursor C, MIToken &Token) { static Cursor maybeLexRegister(Cursor C, MIToken &Token) {
if (C.peek() != '%')
return None;
auto Range = C; auto Range = C;
C.advance(); // Skip '%' C.advance(); // Skip '%'
while (isIdentifierChar(C.peek())) while (isIdentifierChar(C.peek()))
@ -106,7 +116,9 @@ static Cursor lexPercent(Cursor C, MIToken &Token) {
return C; return C;
} }
static Cursor lexGlobalValue(Cursor C, MIToken &Token) { static Cursor maybeLexGlobalValue(Cursor C, MIToken &Token) {
if (C.peek() != '@')
return None;
auto Range = C; auto Range = C;
C.advance(); // Skip the '@' C.advance(); // Skip the '@'
// TODO: add support for quoted names. // TODO: add support for quoted names.
@ -125,7 +137,9 @@ static Cursor lexGlobalValue(Cursor C, MIToken &Token) {
return C; return C;
} }
static Cursor lexIntegerLiteral(Cursor C, MIToken &Token) { static Cursor maybeLexIntegerLiteral(Cursor C, MIToken &Token) {
if (!isdigit(C.peek()) && (C.peek() != '-' || !isdigit(C.peek(1))))
return None;
auto Range = C; auto Range = C;
C.advance(); C.advance();
while (isdigit(C.peek())) while (isdigit(C.peek()))
@ -146,7 +160,10 @@ static MIToken::TokenKind symbolToken(char C) {
} }
} }
static Cursor lexSymbol(Cursor C, MIToken::TokenKind Kind, MIToken &Token) { static Cursor maybeLexSymbol(Cursor C, MIToken &Token) {
auto Kind = symbolToken(C.peek());
if (Kind == MIToken::Error)
return None;
auto Range = C; auto Range = C;
C.advance(); C.advance();
Token = MIToken(Kind, Range.upto(C)); Token = MIToken(Kind, Range.upto(C));
@ -162,23 +179,21 @@ StringRef llvm::lexMIToken(
return C.remaining(); return C.remaining();
} }
auto Char = C.peek(); if (Cursor R = maybeLexIdentifier(C, Token))
if (isalpha(Char) || Char == '_') return R.remaining();
return lexIdentifier(C, Token).remaining(); if (Cursor R = maybeLexMachineBasicBlock(C, Token, ErrorCallback))
if (Char == '%') { return R.remaining();
if (C.remaining().startswith("%bb.")) if (Cursor R = maybeLexRegister(C, Token))
return lexMachineBasicBlock(C, Token, ErrorCallback).remaining(); return R.remaining();
return lexPercent(C, Token).remaining(); if (Cursor R = maybeLexGlobalValue(C, Token))
} return R.remaining();
if (Char == '@') if (Cursor R = maybeLexIntegerLiteral(C, Token))
return lexGlobalValue(C, Token).remaining(); return R.remaining();
if (isdigit(Char) || (Char == '-' && isdigit(C.peek(1)))) if (Cursor R = maybeLexSymbol(C, Token))
return lexIntegerLiteral(C, Token).remaining(); return R.remaining();
MIToken::TokenKind Kind = symbolToken(Char);
if (Kind != MIToken::Error)
return lexSymbol(C, Kind, Token).remaining();
Token = MIToken(MIToken::Error, C.remaining()); Token = MIToken(MIToken::Error, C.remaining());
ErrorCallback(C.location(), ErrorCallback(C.location(),
Twine("unexpected character '") + Twine(Char) + "'"); Twine("unexpected character '") + Twine(C.peek()) + "'");
return C.remaining(); return C.remaining();
} }