X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FTableGen%2FTGLexer.h;h=84d328b12d9764d894cc8b626e49d60e36db32c0;hb=2e6b97bbf86d0825a060e190189fae7f884c79c9;hp=517b81a49612815e2bb38a337a437aa2e4be6b7c;hpb=a8058744229a44e80f90c8530bb7fe47cbab1b70;p=oota-llvm.git diff --git a/utils/TableGen/TGLexer.h b/utils/TableGen/TGLexer.h index 517b81a4961..84d328b12d9 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,59 +14,110 @@ #ifndef TGLEXER_H #define TGLEXER_H -#include +#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; + /// Dependencies - This is the list of all included files. + std::vector Dependencies; - std::string TheError; public: - TGLexer(MemoryBuffer *StartBuf); - ~TGLexer(); + TGLexer(SourceMgr &SrcMgr); + ~TGLexer() {} - void setIncludeDirs(const std::vector &Dirs) { - IncludeDirectories = Dirs; + tgtok::TokKind Lex() { + return CurCode = LexToken(); + } + + const std::vector &getDependencies() const { + return Dependencies; } - 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; + } - const std::string getError() const { return TheError; } + SMLoc getLoc() const; - std::ostream &err(); - void PrintIncludeStack(std::ostream &OS); private: + /// 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