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 TGLEXER_H 15 #define TGLEXER_H 16 17 #include "llvm/Support/DataTypes.h" 18 #include <string> 19 #include <vector> 20 #include <cassert> 21 22 namespace llvm { 23 class MemoryBuffer; 24 class SourceMgr; 25 class SMLoc; 26 class Twine; 27 28 namespace tgtok { 29 enum TokKind { 30 // Markers 31 Eof, Error, 32 33 // Tokens with no info. 34 minus, plus, // - + 35 l_square, r_square, // [ ] 36 l_brace, r_brace, // { } 37 l_paren, r_paren, // ( ) 38 less, greater, // < > 39 colon, semi, // : ; 40 comma, period, // , . 41 equal, question, // = ? 42 43 // Keywords. 44 Bit, Bits, Class, Code, Dag, Def, Defm, Field, In, Int, Let, List, 45 MultiClass, String, 46 47 // !keywords. 48 XConcat, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst, 49 XForEach, XHead, XTail, XEmpty, XIf, XEq, 50 51 // Integer value. 52 IntVal, 53 54 // String valued tokens. 55 Id, StrVal, VarName, CodeFragment 56 }; 57 } 58 59 /// TGLexer - TableGen Lexer class. 60 class TGLexer { 61 SourceMgr &SrcMgr; 62 63 const char *CurPtr; 64 const MemoryBuffer *CurBuf; 65 66 // Information about the current token. 67 const char *TokStart; 68 tgtok::TokKind CurCode; 69 std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT 70 int64_t CurIntVal; // This is valid for INTVAL. 71 72 /// CurBuffer - This is the current buffer index we're lexing from as managed 73 /// by the SourceMgr object. 74 int CurBuffer; 75 /// Dependencies - This is the list of all included files. 76 std::vector<std::string> Dependencies; 77 78 public: 79 TGLexer(SourceMgr &SrcMgr); ~TGLexer()80 ~TGLexer() {} 81 Lex()82 tgtok::TokKind Lex() { 83 return CurCode = LexToken(); 84 } 85 getDependencies()86 const std::vector<std::string> &getDependencies() const { 87 return Dependencies; 88 } 89 getCode()90 tgtok::TokKind getCode() const { return CurCode; } 91 getCurStrVal()92 const std::string &getCurStrVal() const { 93 assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal || 94 CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) && 95 "This token doesn't have a string value"); 96 return CurStrVal; 97 } getCurIntVal()98 int64_t getCurIntVal() const { 99 assert(CurCode == tgtok::IntVal && "This token isn't an integer"); 100 return CurIntVal; 101 } 102 103 SMLoc getLoc() const; 104 105 private: 106 /// LexToken - Read the next token and return its code. 107 tgtok::TokKind LexToken(); 108 109 tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg); 110 111 int getNextChar(); 112 void SkipBCPLComment(); 113 bool SkipCComment(); 114 tgtok::TokKind LexIdentifier(); 115 bool LexInclude(); 116 tgtok::TokKind LexString(); 117 tgtok::TokKind LexVarName(); 118 tgtok::TokKind LexNumber(); 119 tgtok::TokKind LexBracket(); 120 tgtok::TokKind LexExclaim(); 121 }; 122 123 } // end namespace llvm 124 125 #endif 126