[llvm-exegesis][NFC] Fix typo
[llvm-complete.git] / lib / TableGen / TGLexer.h
blob2c80743e3a6840068a6636ecb6e9f09ea520ef44
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.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_TABLEGEN_TGLEXER_H
15 #define LLVM_LIB_TABLEGEN_TGLEXER_H
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>
24 namespace llvm {
25 class SourceMgr;
26 class SMLoc;
27 class Twine;
29 namespace tgtok {
30 enum TokKind {
31 // Markers
32 Eof, Error,
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, // #
45 // Keywords.
46 Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List,
47 MultiClass, String, Defset,
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,
54 // Integer value.
55 IntVal,
57 // Binary constant. Note that these are sized according to the number of
58 // bits given.
59 BinaryIntVal,
61 // String valued tokens.
62 Id, StrVal, VarName, CodeFragment
66 /// TGLexer - TableGen Lexer class.
67 class TGLexer {
68 SourceMgr &SrcMgr;
70 const char *CurPtr;
71 StringRef CurBuf;
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.
79 /// CurBuffer - This is the current buffer index we're lexing from as managed
80 /// by the SourceMgr object.
81 unsigned CurBuffer;
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;
89 public:
90 TGLexer(SourceMgr &SrcMgr);
92 tgtok::TokKind Lex() {
93 return CurCode = LexToken();
96 const DependenciesMapTy &getDependencies() const {
97 return Dependencies;
100 tgtok::TokKind getCode() const { return CurCode; }
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;
108 int64_t getCurIntVal() const {
109 assert(CurCode == tgtok::IntVal && "This token isn't an integer");
110 return CurIntVal;
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);
118 SMLoc getLoc() const;
120 private:
121 /// LexToken - Read the next token and return its code.
122 tgtok::TokKind LexToken();
124 tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg);
126 int getNextChar();
127 int peekNextChar(int Index);
128 void SkipBCPLComment();
129 bool SkipCComment();
130 tgtok::TokKind LexIdentifier();
131 bool LexInclude();
132 tgtok::TokKind LexString();
133 tgtok::TokKind LexVarName();
134 tgtok::TokKind LexNumber();
135 tgtok::TokKind LexBracket();
136 tgtok::TokKind LexExclaim();
139 } // end namespace llvm
141 #endif