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