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 paste, // # 43 44 // Keywords. 45 Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List, 46 MultiClass, String, 47 48 // !keywords. 49 XConcat, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst, 50 XForEach, XHead, XTail, XEmpty, XIf, XEq, 51 52 // Integer value. 53 IntVal, 54 55 // String valued tokens. 56 Id, StrVal, VarName, CodeFragment 57 }; 58 } 59 60 /// TGLexer - TableGen Lexer class. 61 class TGLexer { 62 SourceMgr &SrcMgr; 63 64 const char *CurPtr; 65 const MemoryBuffer *CurBuf; 66 67 // Information about the current token. 68 const char *TokStart; 69 tgtok::TokKind CurCode; 70 std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT 71 int64_t CurIntVal; // This is valid for INTVAL. 72 73 /// CurBuffer - This is the current buffer index we're lexing from as managed 74 /// by the SourceMgr object. 75 int CurBuffer; 76 /// Dependencies - This is the list of all included files. 77 std::vector<std::string> Dependencies; 78 79 public: 80 TGLexer(SourceMgr &SrcMgr); ~TGLexer()81 ~TGLexer() {} 82 Lex()83 tgtok::TokKind Lex() { 84 return CurCode = LexToken(); 85 } 86 getDependencies()87 const std::vector<std::string> &getDependencies() const { 88 return Dependencies; 89 } 90 getCode()91 tgtok::TokKind getCode() const { return CurCode; } 92 getCurStrVal()93 const std::string &getCurStrVal() const { 94 assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal || 95 CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) && 96 "This token doesn't have a string value"); 97 return CurStrVal; 98 } getCurIntVal()99 int64_t getCurIntVal() const { 100 assert(CurCode == tgtok::IntVal && "This token isn't an integer"); 101 return CurIntVal; 102 } 103 104 SMLoc getLoc() const; 105 106 private: 107 /// LexToken - Read the next token and return its code. 108 tgtok::TokKind LexToken(); 109 110 tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg); 111 112 int getNextChar(); 113 int peekNextChar(int Index); 114 void SkipBCPLComment(); 115 bool SkipCComment(); 116 tgtok::TokKind LexIdentifier(); 117 bool LexInclude(); 118 tgtok::TokKind LexString(); 119 tgtok::TokKind LexVarName(); 120 tgtok::TokKind LexNumber(); 121 tgtok::TokKind LexBracket(); 122 tgtok::TokKind LexExclaim(); 123 }; 124 125 } // end namespace llvm 126 127 #endif 128