Expose Tokens to target specific assembly parsers.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77337 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2009-07-28 17:58:44 +00:00
parent bf15e433b9
commit cbbe248441
4 changed files with 101 additions and 83 deletions

View File

@ -10,21 +10,114 @@
#ifndef LLVM_MC_MCASMLEXER_H
#define LLVM_MC_MCASMLEXER_H
#include "llvm/ADT/StringRef.h"
namespace llvm {
class MCAsmLexer;
class MCInst;
class SMLoc;
class Target;
/// AsmToken - Target independent representation for an assembler token.
struct AsmToken {
enum TokenKind {
// Markers
Eof, Error,
// String values.
Identifier,
Register,
String,
// Integer values.
Integer,
// No-value.
EndOfStatement,
Colon,
Plus, Minus, Tilde,
Slash, // '/'
LParen, RParen,
Star, Comma, Dollar, Equal, EqualEqual,
Pipe, PipePipe, Caret,
Amp, AmpAmp, Exclaim, ExclaimEqual, Percent,
Less, LessEqual, LessLess, LessGreater,
Greater, GreaterEqual, GreaterGreater
};
TokenKind Kind;
/// A reference to the entire token contents; this is always a pointer into
/// a memory buffer owned by the source manager.
StringRef Str;
int64_t IntVal;
public:
AsmToken() {}
AsmToken(TokenKind _Kind, const StringRef &_Str, int64_t _IntVal = 0)
: Kind(_Kind), Str(_Str), IntVal(_IntVal) {}
TokenKind getKind() const { return Kind; }
bool is(TokenKind K) const { return Kind == K; }
bool isNot(TokenKind K) const { return Kind != K; }
SMLoc getLoc() const;
/// getString - Get the string for the current token, this includes all
/// characters (for example, the quotes on strings) in the token.
///
/// The returned StringRef points into the source manager's memory buffer, and
/// is safe to store across calls to Lex().
StringRef getString() const { return Str; }
// FIXME: Don't compute this in advance, it makes every token larger, and is
// also not generally what we want (it is nicer for recovery etc. to lex 123br
// as a single token, then diagnose as an invalid number).
int64_t getIntVal() const {
assert(Kind == Integer && "This token isn't an integer");
return IntVal;
}
};
/// MCAsmLexer - Generic assembler lexer interface, for use by target specific
/// assembly lexers.
class MCAsmLexer {
/// The current token, stored in the base class for faster access.
AsmToken CurTok;
MCAsmLexer(const MCAsmLexer &); // DO NOT IMPLEMENT
void operator=(const MCAsmLexer &); // DO NOT IMPLEMENT
protected: // Can only create subclasses.
MCAsmLexer();
virtual AsmToken LexToken() = 0;
public:
virtual ~MCAsmLexer();
/// Lex - Consume the next token from the input stream and return it.
///
/// The lexer will continuosly return the end-of-file token once the end of
/// the main input file has been reached.
const AsmToken &Lex() {
return CurTok = LexToken();
}
/// getTok - Get the current (last) lexed token.
const AsmToken &getTok() {
return CurTok;
}
/// getKind - Get the kind of current token.
AsmToken::TokenKind getKind() const { return CurTok.getKind(); }
/// is - Check if the current token has kind \arg K.
bool is(AsmToken::TokenKind K) const { return CurTok.is(K); }
/// isNot - Check if the current token has kind \arg K.
bool isNot(AsmToken::TokenKind K) const { return CurTok.isNot(K); }
};
} // End llvm namespace

View File

@ -11,7 +11,7 @@
using namespace llvm;
MCAsmLexer::MCAsmLexer() {
MCAsmLexer::MCAsmLexer() : CurTok(AsmToken::Error, StringRef()) {
}
MCAsmLexer::~MCAsmLexer() {

View File

@ -24,7 +24,6 @@ AsmLexer::AsmLexer(SourceMgr &SM) : SrcMgr(SM) {
CurBuffer = 0;
CurBuf = SrcMgr.getMemoryBuffer(CurBuffer);
CurPtr = CurBuf->getBufferStart();
CurTok = AsmToken(AsmToken::Error, StringRef(CurPtr, 0));
TokStart = 0;
}

View File

@ -25,69 +25,6 @@ class MemoryBuffer;
class SourceMgr;
class SMLoc;
/// AsmToken - Target independent representation for an assembler token.
struct AsmToken {
enum TokenKind {
// Markers
Eof, Error,
// String values.
Identifier,
Register,
String,
// Integer values.
Integer,
// No-value.
EndOfStatement,
Colon,
Plus, Minus, Tilde,
Slash, // '/'
LParen, RParen,
Star, Comma, Dollar, Equal, EqualEqual,
Pipe, PipePipe, Caret,
Amp, AmpAmp, Exclaim, ExclaimEqual, Percent,
Less, LessEqual, LessLess, LessGreater,
Greater, GreaterEqual, GreaterGreater
};
TokenKind Kind;
/// A reference to the entire token contents; this is always a pointer into
/// a memory buffer owned by the source manager.
StringRef Str;
int64_t IntVal;
public:
AsmToken() {}
AsmToken(TokenKind _Kind, const StringRef &_Str, int64_t _IntVal = 0)
: Kind(_Kind), Str(_Str), IntVal(_IntVal) {}
TokenKind getKind() const { return Kind; }
bool is(TokenKind K) const { return Kind == K; }
bool isNot(TokenKind K) const { return Kind != K; }
SMLoc getLoc() const;
/// getString - Get the string for the current token, this includes all
/// characters (for example, the quotes on strings) in the token.
///
/// The returned StringRef points into the source manager's memory buffer, and
/// is safe to store across calls to Lex().
StringRef getString() const { return Str; }
// FIXME: Don't compute this in advance, it makes every token larger, and is
// also not generally what we want (it is nicer for recovery etc. to lex 123br
// as a single token, then diagnose as an invalid number).
int64_t getIntVal() const {
assert(Kind == Integer && "This token isn't an integer");
return IntVal;
}
};
/// AsmLexer - Lexer class for assembly files.
class AsmLexer : public MCAsmLexer {
SourceMgr &SrcMgr;
@ -97,32 +34,23 @@ class AsmLexer : public MCAsmLexer {
const char *TokStart;
/// The current token.
AsmToken CurTok;
/// This is the current buffer index we're lexing from as managed by the
/// SourceMgr object.
int CurBuffer;
void operator=(const AsmLexer&); // DO NOT IMPLEMENT
AsmLexer(const AsmLexer&); // DO NOT IMPLEMENT
protected:
/// LexToken - Read the next token and return its code.
virtual AsmToken LexToken();
public:
AsmLexer(SourceMgr &SrcMgr);
~AsmLexer();
const AsmToken &Lex() {
return CurTok = LexToken();
}
AsmToken::TokenKind getKind() const { return CurTok.getKind(); }
bool is(AsmToken::TokenKind K) const { return CurTok.is(K); }
bool isNot(AsmToken::TokenKind K) const { return CurTok.isNot(K); }
SMLoc getLoc() const;
/// getTok - Return a reference to the current (last) lexed token.
const AsmToken &getTok() const { return CurTok; }
/// EnterIncludeFile - Enter the specified file. This returns true on failure.
bool EnterIncludeFile(const std::string &Filename);
@ -132,8 +60,6 @@ private:
int getNextChar();
AsmToken ReturnError(const char *Loc, const std::string &Msg);
/// LexToken - Read the next token and return its code.
AsmToken LexToken();
AsmToken LexIdentifier();
AsmToken LexPercent();
AsmToken LexSlash();