8a850b5cec8e7c1de006ff7c4aeec5b5031c5179
[oota-llvm.git] / lib / TableGen / TGLexer.h
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);
81   ~TGLexer() {}
82   
83   tgtok::TokKind Lex() {
84     return CurCode = LexToken();
85   }
86
87   const std::vector<std::string> &getDependencies() const {
88     return Dependencies;
89   }
90   
91   tgtok::TokKind getCode() const { return CurCode; }
92
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   }
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