X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FTableGen%2FTGLexer.h;h=0e67f680557dffd1ca96c8782391e50205e29d53;hb=20072af3b0b22d90afbce769409f4ed822520366;hp=dab68c3aabcb8f0f942850cd7f49bd335e3a96a1;hpb=c8a9bbcbc777f5071ed67879b9f6f3b02c5d1e34;p=oota-llvm.git diff --git a/utils/TableGen/TGLexer.h b/utils/TableGen/TGLexer.h index dab68c3aabc..0e67f680557 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,18 +14,57 @@ #ifndef TGLEXER_H #define TGLEXER_H +#include "llvm/Support/DataTypes.h" #include #include #include +#include namespace llvm { class MemoryBuffer; + +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, + + // Integer value. + IntVal, + + // String valued tokens. + Id, StrVal, VarName, CodeFragment + }; +} +/// TGLexer - TableGen Lexer class. class TGLexer { const char *CurPtr; unsigned CurLineNo; 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. + /// IncludeRec / IncludeStack - This captures the current set of include /// directives we are nested within. struct IncludeRec { @@ -48,26 +87,46 @@ public: IncludeDirectories = Dirs; } - int LexToken(); + tgtok::TokKind Lex() { + return CurCode = LexToken(); + } + + tgtok::TokKind getCode() const { return CurCode; } - void PrintError(const char *Loc, const std::string &Msg) const; + 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* LocTy; + LocTy getLoc() const { return TokStart; } + + void PrintError(LocTy Loc, const std::string &Msg) const; - std::ostream &err() const; void PrintIncludeStack(std::ostream &OS) 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 std::string &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