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