1*9880d681SAndroid Build Coastguard Worker //===- TGLexer.h - Lexer for TableGen Files ---------------------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This class represents the Lexer for tablegen files. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TABLEGEN_TGLEXER_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TABLEGEN_TGLEXER_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringRef.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DataTypes.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SMLoc.h" 20*9880d681SAndroid Build Coastguard Worker #include <cassert> 21*9880d681SAndroid Build Coastguard Worker #include <map> 22*9880d681SAndroid Build Coastguard Worker #include <string> 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker namespace llvm { 25*9880d681SAndroid Build Coastguard Worker class SourceMgr; 26*9880d681SAndroid Build Coastguard Worker class SMLoc; 27*9880d681SAndroid Build Coastguard Worker class Twine; 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker namespace tgtok { 30*9880d681SAndroid Build Coastguard Worker enum TokKind { 31*9880d681SAndroid Build Coastguard Worker // Markers 32*9880d681SAndroid Build Coastguard Worker Eof, Error, 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker // Tokens with no info. 35*9880d681SAndroid Build Coastguard Worker minus, plus, // - + 36*9880d681SAndroid Build Coastguard Worker l_square, r_square, // [ ] 37*9880d681SAndroid Build Coastguard Worker l_brace, r_brace, // { } 38*9880d681SAndroid Build Coastguard Worker l_paren, r_paren, // ( ) 39*9880d681SAndroid Build Coastguard Worker less, greater, // < > 40*9880d681SAndroid Build Coastguard Worker colon, semi, // : ; 41*9880d681SAndroid Build Coastguard Worker comma, period, // , . 42*9880d681SAndroid Build Coastguard Worker equal, question, // = ? 43*9880d681SAndroid Build Coastguard Worker paste, // # 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker // Keywords. 46*9880d681SAndroid Build Coastguard Worker Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List, 47*9880d681SAndroid Build Coastguard Worker MultiClass, String, 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker // !keywords. 50*9880d681SAndroid Build Coastguard Worker XConcat, XADD, XAND, XSRA, XSRL, XSHL, XListConcat, XStrConcat, XCast, 51*9880d681SAndroid Build Coastguard Worker XSubst, XForEach, XHead, XTail, XEmpty, XIf, XEq, 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker // Integer value. 54*9880d681SAndroid Build Coastguard Worker IntVal, 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker // Binary constant. Note that these are sized according to the number of 57*9880d681SAndroid Build Coastguard Worker // bits given. 58*9880d681SAndroid Build Coastguard Worker BinaryIntVal, 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker // String valued tokens. 61*9880d681SAndroid Build Coastguard Worker Id, StrVal, VarName, CodeFragment 62*9880d681SAndroid Build Coastguard Worker }; 63*9880d681SAndroid Build Coastguard Worker } 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker /// TGLexer - TableGen Lexer class. 66*9880d681SAndroid Build Coastguard Worker class TGLexer { 67*9880d681SAndroid Build Coastguard Worker SourceMgr &SrcMgr; 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker const char *CurPtr; 70*9880d681SAndroid Build Coastguard Worker StringRef CurBuf; 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker // Information about the current token. 73*9880d681SAndroid Build Coastguard Worker const char *TokStart; 74*9880d681SAndroid Build Coastguard Worker tgtok::TokKind CurCode; 75*9880d681SAndroid Build Coastguard Worker std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT 76*9880d681SAndroid Build Coastguard Worker int64_t CurIntVal; // This is valid for INTVAL. 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker /// CurBuffer - This is the current buffer index we're lexing from as managed 79*9880d681SAndroid Build Coastguard Worker /// by the SourceMgr object. 80*9880d681SAndroid Build Coastguard Worker unsigned CurBuffer; 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker public: 83*9880d681SAndroid Build Coastguard Worker typedef std::map<std::string, SMLoc> DependenciesMapTy; 84*9880d681SAndroid Build Coastguard Worker private: 85*9880d681SAndroid Build Coastguard Worker /// Dependencies - This is the list of all included files. 86*9880d681SAndroid Build Coastguard Worker DependenciesMapTy Dependencies; 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker public: 89*9880d681SAndroid Build Coastguard Worker TGLexer(SourceMgr &SrcMgr); 90*9880d681SAndroid Build Coastguard Worker Lex()91*9880d681SAndroid Build Coastguard Worker tgtok::TokKind Lex() { 92*9880d681SAndroid Build Coastguard Worker return CurCode = LexToken(); 93*9880d681SAndroid Build Coastguard Worker } 94*9880d681SAndroid Build Coastguard Worker getDependencies()95*9880d681SAndroid Build Coastguard Worker const DependenciesMapTy &getDependencies() const { 96*9880d681SAndroid Build Coastguard Worker return Dependencies; 97*9880d681SAndroid Build Coastguard Worker } 98*9880d681SAndroid Build Coastguard Worker getCode()99*9880d681SAndroid Build Coastguard Worker tgtok::TokKind getCode() const { return CurCode; } 100*9880d681SAndroid Build Coastguard Worker getCurStrVal()101*9880d681SAndroid Build Coastguard Worker const std::string &getCurStrVal() const { 102*9880d681SAndroid Build Coastguard Worker assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal || 103*9880d681SAndroid Build Coastguard Worker CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) && 104*9880d681SAndroid Build Coastguard Worker "This token doesn't have a string value"); 105*9880d681SAndroid Build Coastguard Worker return CurStrVal; 106*9880d681SAndroid Build Coastguard Worker } getCurIntVal()107*9880d681SAndroid Build Coastguard Worker int64_t getCurIntVal() const { 108*9880d681SAndroid Build Coastguard Worker assert(CurCode == tgtok::IntVal && "This token isn't an integer"); 109*9880d681SAndroid Build Coastguard Worker return CurIntVal; 110*9880d681SAndroid Build Coastguard Worker } getCurBinaryIntVal()111*9880d681SAndroid Build Coastguard Worker std::pair<int64_t, unsigned> getCurBinaryIntVal() const { 112*9880d681SAndroid Build Coastguard Worker assert(CurCode == tgtok::BinaryIntVal && 113*9880d681SAndroid Build Coastguard Worker "This token isn't a binary integer"); 114*9880d681SAndroid Build Coastguard Worker return std::make_pair(CurIntVal, (CurPtr - TokStart)-2); 115*9880d681SAndroid Build Coastguard Worker } 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker SMLoc getLoc() const; 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker private: 120*9880d681SAndroid Build Coastguard Worker /// LexToken - Read the next token and return its code. 121*9880d681SAndroid Build Coastguard Worker tgtok::TokKind LexToken(); 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg); 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker int getNextChar(); 126*9880d681SAndroid Build Coastguard Worker int peekNextChar(int Index); 127*9880d681SAndroid Build Coastguard Worker void SkipBCPLComment(); 128*9880d681SAndroid Build Coastguard Worker bool SkipCComment(); 129*9880d681SAndroid Build Coastguard Worker tgtok::TokKind LexIdentifier(); 130*9880d681SAndroid Build Coastguard Worker bool LexInclude(); 131*9880d681SAndroid Build Coastguard Worker tgtok::TokKind LexString(); 132*9880d681SAndroid Build Coastguard Worker tgtok::TokKind LexVarName(); 133*9880d681SAndroid Build Coastguard Worker tgtok::TokKind LexNumber(); 134*9880d681SAndroid Build Coastguard Worker tgtok::TokKind LexBracket(); 135*9880d681SAndroid Build Coastguard Worker tgtok::TokKind LexExclaim(); 136*9880d681SAndroid Build Coastguard Worker }; 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker #endif 141