Merge branch 'master' into msp430
[llvm/msp430.git] / utils / TableGen / TGLexer.h
blobac3b9840039b2fa2dd9738e88c40b5b84cbb713f
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 TGLEXER_H
15 #define TGLEXER_H
17 #include "llvm/Support/DataTypes.h"
18 #include <vector>
19 #include <string>
20 #include <iosfwd>
21 #include <cassert>
23 namespace llvm {
24 class MemoryBuffer;
25 class TGSourceMgr;
26 class TGLoc;
28 namespace tgtok {
29 enum TokKind {
30 // Markers
31 Eof, Error,
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, // = ?
43 // Keywords.
44 Bit, Bits, Class, Code, Dag, Def, Defm, Field, In, Int, Let, List,
45 MultiClass, String,
47 // !keywords.
48 XConcat, XSRA, XSRL, XSHL, XStrConcat, XNameConcat, XCast, XSubst,
49 XForEach, XCar, XCdr, XNull, XIf,
51 // Integer value.
52 IntVal,
54 // String valued tokens.
55 Id, StrVal, VarName, CodeFragment
59 /// TGLexer - TableGen Lexer class.
60 class TGLexer {
61 TGSourceMgr &SrcMgr;
63 const char *CurPtr;
64 const MemoryBuffer *CurBuf;
66 // Information about the current token.
67 const char *TokStart;
68 tgtok::TokKind CurCode;
69 std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT
70 int64_t CurIntVal; // This is valid for INTVAL.
72 /// CurBuffer - This is the current buffer index we're lexing from as managed
73 /// by the SourceMgr object.
74 int CurBuffer;
76 // IncludeDirectories - This is the list of directories we should search for
77 // include files in.
78 std::vector<std::string> IncludeDirectories;
79 public:
80 TGLexer(TGSourceMgr &SrcMgr);
81 ~TGLexer() {}
83 void setIncludeDirs(const std::vector<std::string> &Dirs) {
84 IncludeDirectories = Dirs;
87 tgtok::TokKind Lex() {
88 return CurCode = LexToken();
91 tgtok::TokKind getCode() const { return CurCode; }
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;
99 int64_t getCurIntVal() const {
100 assert(CurCode == tgtok::IntVal && "This token isn't an integer");
101 return CurIntVal;
104 TGLoc getLoc() const;
106 void PrintError(const char *Loc, const std::string &Msg) const;
107 void PrintError(TGLoc Loc, const std::string &Msg) const;
109 private:
110 /// LexToken - Read the next token and return its code.
111 tgtok::TokKind LexToken();
113 tgtok::TokKind ReturnError(const char *Loc, const std::string &Msg);
115 int getNextChar();
116 void SkipBCPLComment();
117 bool SkipCComment();
118 tgtok::TokKind LexIdentifier();
119 bool LexInclude();
120 tgtok::TokKind LexString();
121 tgtok::TokKind LexVarName();
122 tgtok::TokKind LexNumber();
123 tgtok::TokKind LexBracket();
124 tgtok::TokKind LexExclaim();
127 } // end namespace llvm
129 #endif