summaryrefslogtreecommitdiffstats
path: root/tools/llvm-mc/AsmLexer.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvm-mc/AsmLexer.h')
-rw-r--r--tools/llvm-mc/AsmLexer.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/tools/llvm-mc/AsmLexer.h b/tools/llvm-mc/AsmLexer.h
new file mode 100644
index 0000000..a6c9323
--- /dev/null
+++ b/tools/llvm-mc/AsmLexer.h
@@ -0,0 +1,109 @@
+//===- AsmLexer.h - Lexer for Assembly Files --------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This class declares the lexer for assembly files.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef ASMLEXER_H
+#define ASMLEXER_H
+
+#include "llvm/Support/DataTypes.h"
+#include <string>
+#include <cassert>
+
+namespace llvm {
+class MemoryBuffer;
+class SourceMgr;
+class SMLoc;
+
+namespace asmtok {
+ enum TokKind {
+ // Markers
+ Eof, Error,
+
+ // String values.
+ Identifier,
+ Register,
+ String,
+
+ // Integer values.
+ IntVal,
+
+ // No-value.
+ EndOfStatement,
+ Colon,
+ Plus, Minus, Tilde,
+ Slash, // '/'
+ LParen, RParen,
+ Star, Comma, Dollar
+ };
+}
+
+/// AsmLexer - Lexer class for assembly files.
+class AsmLexer {
+ SourceMgr &SrcMgr;
+
+ const char *CurPtr;
+ const MemoryBuffer *CurBuf;
+
+ // Information about the current token.
+ const char *TokStart;
+ asmtok::TokKind CurKind;
+ std::string CurStrVal; // This is valid for Identifier.
+ int64_t CurIntVal;
+
+ /// CurBuffer - This is the current buffer index we're lexing from as managed
+ /// by the SourceMgr object.
+ int CurBuffer;
+
+public:
+ AsmLexer(SourceMgr &SrcMgr);
+ ~AsmLexer() {}
+
+ asmtok::TokKind Lex() {
+ return CurKind = LexToken();
+ }
+
+ asmtok::TokKind getKind() const { return CurKind; }
+ bool is(asmtok::TokKind K) const { return CurKind == K; }
+ bool isNot(asmtok::TokKind K) const { return CurKind != K; }
+
+ const std::string &getCurStrVal() const {
+ assert((CurKind == asmtok::Identifier || CurKind == asmtok::Register ||
+ CurKind == asmtok::String) &&
+ "This token doesn't have a string value");
+ return CurStrVal;
+ }
+ int64_t getCurIntVal() const {
+ assert(CurKind == asmtok::IntVal && "This token isn't an integer");
+ return CurIntVal;
+ }
+
+ SMLoc getLoc() const;
+
+ void PrintMessage(SMLoc Loc, const std::string &Msg) const;
+
+private:
+ int getNextChar();
+ asmtok::TokKind ReturnError(const char *Loc, const std::string &Msg);
+
+ /// LexToken - Read the next token and return its code.
+ asmtok::TokKind LexToken();
+ asmtok::TokKind LexIdentifier();
+ asmtok::TokKind LexPercent();
+ asmtok::TokKind LexSlash();
+ asmtok::TokKind LexHash();
+ asmtok::TokKind LexDigit();
+ asmtok::TokKind LexQuote();
+};
+
+} // end namespace llvm
+
+#endif
OpenPOWER on IntegriCloud