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 
FindFirstNonCommonLetter(const std::vector<const StringMatcher::StringPair * > & Matches)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, Defset,
48 
49     // !keywords.
50     XConcat, XADD, XAND, XOR, XSRA, XSRL, XSHL, XListConcat, XStrConcat, XCast,
51     XSubst, XForEach, XFoldl, XHead, XTail, XSize, XEmpty, XIf, XEq, XIsA, XDag,
52     XNe, XLe, XLt, XGe, XGt,
53 
54     // Integer value.
55     IntVal,
56 
57     // Binary constant.  Note that these are sized according to the number of
58     // bits given.
59     BinaryIntVal,
60 
61     // String valued tokens.
62     Id, StrVal, VarName, CodeFragment
63   };
64 }
65 
66 /// TGLexer - TableGen Lexer class.
67 class TGLexer {
68   SourceMgr &SrcMgr;
69 
70   const char *CurPtr;
71   StringRef CurBuf;
72 
73   // Information about the current token.
74   const char *TokStart;
75   tgtok::TokKind CurCode;
76   std::string CurStrVal;  // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT
77   int64_t CurIntVal;      // This is valid for INTVAL.
78 
79   /// CurBuffer - This is the current buffer index we're lexing from as managed
80   /// by the SourceMgr object.
81   unsigned CurBuffer;
82 
83 public:
84   typedef std::map<std::string, SMLoc> DependenciesMapTy;
85 private:
86   /// Dependencies - This is the list of all included files.
87   DependenciesMapTy Dependencies;
88 
89 public:
90   TGLexer(SourceMgr &SrcMgr);
91 
92   tgtok::TokKind Lex() {
93     return CurCode = LexToken();
94   }
95 
96   const DependenciesMapTy &getDependencies() const {
97     return Dependencies;
98   }
99 
100   tgtok::TokKind getCode() const { return CurCode; }
101 
102   const std::string &getCurStrVal() const {
103     assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal ||
104             CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) &&
105            "This token doesn't have a string value");
106     return CurStrVal;
107   }
108   int64_t getCurIntVal() const {
109     assert(CurCode == tgtok::IntVal && "This token isn't an integer");
110     return CurIntVal;
111   }
112   std::pair<int64_t, unsigned> getCurBinaryIntVal() const {
113     assert(CurCode == tgtok::BinaryIntVal &&
114            "This token isn't a binary integer");
115     return std::make_pair(CurIntVal, (CurPtr - TokStart)-2);
116   }
117 
118   SMLoc getLoc() const;
119 
120 private:
121   /// LexToken - Read the next token and return its code.
122   tgtok::TokKind LexToken();
123 
124   tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg);
125 
126   int getNextChar();
127   int peekNextChar(int Index);
128   void SkipBCPLComment();
129   bool SkipCComment();
130   tgtok::TokKind LexIdentifier();
131   bool LexInclude();
Emit(unsigned Indent,bool IgnoreDuplicates) const132   tgtok::TokKind LexString();
133   tgtok::TokKind LexVarName();
134   tgtok::TokKind LexNumber();
135   tgtok::TokKind LexBracket();
136   tgtok::TokKind LexExclaim();
137 };
138 
139 } // end namespace llvm
140 
141 #endif
142