//
// The LLVM Compiler Infrastructure
//
-// This file was developed by Chris Lattner and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
#ifndef TGLEXER_H
#define TGLEXER_H
-#include <vector>
+#include "llvm/Support/DataTypes.h"
#include <string>
-#include <iosfwd>
+#include <vector>
+#include <cassert>
namespace llvm {
class MemoryBuffer;
-
+class SourceMgr;
+class SMLoc;
+class Twine;
+
namespace tgtok {
enum TokKind {
// Markers
l_brace, r_brace, // { }
l_paren, r_paren, // ( )
less, greater, // < >
- colon, semi, // ; :
+ colon, semi, // : ;
comma, period, // , .
equal, question, // = ?
MultiClass, String,
// !keywords.
- XConcat, XSRA, XSRL, XSHL, XStrConcat,
-
+ XConcat, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst,
+ XForEach, XHead, XTail, XEmpty, XIf, XEq,
+
// Integer value.
IntVal,
/// TGLexer - TableGen Lexer class.
class TGLexer {
+ SourceMgr &SrcMgr;
+
const char *CurPtr;
- unsigned CurLineNo;
- MemoryBuffer *CurBuf;
+ const MemoryBuffer *CurBuf;
// Information about the current token.
const char *TokStart;
tgtok::TokKind CurCode;
std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT
- int CurIntVal; // This is valid for INTVAL.
-
- /// IncludeRec / IncludeStack - This captures the current set of include
- /// directives we are nested within.
- struct IncludeRec {
- MemoryBuffer *Buffer;
- const char *CurPtr;
- unsigned LineNo;
- IncludeRec(MemoryBuffer *buffer, const char *curPtr, unsigned lineNo)
- : Buffer(buffer), CurPtr(curPtr), LineNo(lineNo) {}
- };
- std::vector<IncludeRec> IncludeStack;
+ int64_t CurIntVal; // This is valid for INTVAL.
+
+ /// CurBuffer - This is the current buffer index we're lexing from as managed
+ /// by the SourceMgr object.
+ int CurBuffer;
+ /// Dependencies - This is the list of all included files.
+ std::vector<std::string> Dependencies;
- // IncludeDirectories - This is the list of directories we should search for
- // include files in.
- std::vector<std::string> IncludeDirectories;
public:
- TGLexer(MemoryBuffer *StartBuf);
- ~TGLexer();
-
- void setIncludeDirs(const std::vector<std::string> &Dirs) {
- IncludeDirectories = Dirs;
- }
+ TGLexer(SourceMgr &SrcMgr);
+ ~TGLexer() {}
tgtok::TokKind Lex() {
return CurCode = LexToken();
}
+
+ const std::vector<std::string> &getDependencies() const {
+ return Dependencies;
+ }
tgtok::TokKind getCode() const { return CurCode; }
"This token doesn't have a string value");
return CurStrVal;
}
- int getCurIntVal() const {
+ int64_t getCurIntVal() const {
assert(CurCode == tgtok::IntVal && "This token isn't an integer");
return CurIntVal;
}
- typedef const char* LocTy;
- LocTy getLoc() const { return TokStart; }
-
- void PrintError(LocTy Loc, const std::string &Msg) const;
-
- void PrintIncludeStack(std::ostream &OS) const;
+ SMLoc getLoc() const;
private:
/// LexToken - Read the next token and return its code.
tgtok::TokKind LexToken();
- tgtok::TokKind ReturnError(const char *Loc, const std::string &Msg);
+ tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg);
int getNextChar();
void SkipBCPLComment();