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