X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FTableGen%2FTGLexer.h;h=8859479874020dfa75c1a1695150ddeb9caa8023;hb=505f3cd2965e65b6b7ad023eaba0e3dc89b67409;hp=ef786b6f28bcb58741f616daa4a479a60e94021c;hpb=56a9fcfd1e19c7adfcc4c948e2f5e471ca8ed241;p=oota-llvm.git diff --git a/utils/TableGen/TGLexer.h b/utils/TableGen/TGLexer.h index ef786b6f28b..88594798740 100644 --- a/utils/TableGen/TGLexer.h +++ b/utils/TableGen/TGLexer.h @@ -2,8 +2,8 @@ // // 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. // //===----------------------------------------------------------------------===// // @@ -14,64 +14,107 @@ #ifndef TGLEXER_H #define TGLEXER_H +#include "llvm/Support/DataTypes.h" #include #include -#include +#include namespace llvm { class MemoryBuffer; +class SourceMgr; +class SMLoc; +class Twine; -class TGLexer { - const char *CurPtr; - unsigned CurLineNo; - MemoryBuffer *CurBuf; +namespace tgtok { + enum TokKind { + // Markers + Eof, Error, + + // Tokens with no info. + minus, plus, // - + + l_square, r_square, // [ ] + l_brace, r_brace, // { } + l_paren, r_paren, // ( ) + less, greater, // < > + colon, semi, // : ; + comma, period, // , . + equal, question, // = ? + + // Keywords. + Bit, Bits, Class, Code, Dag, Def, Defm, Field, In, Int, Let, List, + MultiClass, String, + + // !keywords. + XConcat, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst, + XForEach, XHead, XTail, XEmpty, XIf, XEq, - /// 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) {} + // Integer value. + IntVal, + + // String valued tokens. + Id, StrVal, VarName, CodeFragment }; - std::vector IncludeStack; +} + +/// TGLexer - TableGen Lexer class. +class TGLexer { + SourceMgr &SrcMgr; - // IncludeDirectories - This is the list of directories we should search for - // include files in. - std::vector IncludeDirectories; + const char *CurPtr; + 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 + 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; + public: - TGLexer(MemoryBuffer *StartBuf); - ~TGLexer(); + TGLexer(SourceMgr &SrcMgr); + ~TGLexer() {} - void setIncludeDirs(const std::vector &Dirs) { - IncludeDirectories = Dirs; + tgtok::TokKind Lex() { + return CurCode = LexToken(); } - int LexToken(); + tgtok::TokKind getCode() const { return CurCode; } + + const std::string &getCurStrVal() const { + assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal || + CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) && + "This token doesn't have a string value"); + return CurStrVal; + } + int64_t getCurIntVal() const { + assert(CurCode == tgtok::IntVal && "This token isn't an integer"); + return CurIntVal; + } - typedef const char* LocationTy; - LocationTy getTokenStart() const { return TokStart; } + SMLoc getLoc() const; - void PrintError(LocationTy Loc, const std::string &Msg) const; - - std::ostream &err() const; - void PrintIncludeStack(std::ostream &OS) const; + void PrintError(const char *Loc, const Twine &Msg) const; + void PrintError(SMLoc Loc, const Twine &Msg) const; private: - int ReturnError(const char *Loc, const std::string &Msg); + /// LexToken - Read the next token and return its code. + tgtok::TokKind LexToken(); + + tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg); int getNextChar(); void SkipBCPLComment(); bool SkipCComment(); - int LexIdentifier(); + tgtok::TokKind LexIdentifier(); bool LexInclude(); - int LexString(); - int LexVarName(); - int LexNumber(); - int LexBracket(); - int LexExclaim(); + tgtok::TokKind LexString(); + tgtok::TokKind LexVarName(); + tgtok::TokKind LexNumber(); + tgtok::TokKind LexBracket(); + tgtok::TokKind LexExclaim(); }; } // end namespace llvm