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
22namespace llvm {
23class MemoryBuffer;
24class SourceMgr;
25class SMLoc;
26class Twine;
27
28namespace 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
43    // Keywords.
44    Bit, Bits, Class, Code, Dag, Def, Defm, Field, In, Int, Let, List,
45    MultiClass, String,
46
47    // !keywords.
48    XConcat, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst,
49    XForEach, XHead, XTail, XEmpty, XIf, XEq,
50
51    // Integer value.
52    IntVal,
53
54    // String valued tokens.
55    Id, StrVal, VarName, CodeFragment
56  };
57}
58
59/// TGLexer - TableGen Lexer class.
60class TGLexer {
61  SourceMgr &SrcMgr;
62
63  const char *CurPtr;
64  const MemoryBuffer *CurBuf;
65
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.
71
72  /// CurBuffer - This is the current buffer index we're lexing from as managed
73  /// by the SourceMgr object.
74  int CurBuffer;
75  /// Dependencies - This is the list of all included files.
76  std::vector<std::string> Dependencies;
77
78public:
79  TGLexer(SourceMgr &SrcMgr);
80  ~TGLexer() {}
81
82  tgtok::TokKind Lex() {
83    return CurCode = LexToken();
84  }
85
86  const std::vector<std::string> &getDependencies() const {
87    return Dependencies;
88  }
89
90  tgtok::TokKind getCode() const { return CurCode; }
91
92  const std::string &getCurStrVal() const {
93    assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal ||
94            CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) &&
95           "This token doesn't have a string value");
96    return CurStrVal;
97  }
98  int64_t getCurIntVal() const {
99    assert(CurCode == tgtok::IntVal && "This token isn't an integer");
100    return CurIntVal;
101  }
102
103  SMLoc getLoc() const;
104
105private:
106  /// LexToken - Read the next token and return its code.
107  tgtok::TokKind LexToken();
108
109  tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg);
110
111  int getNextChar();
112  void SkipBCPLComment();
113  bool SkipCComment();
114  tgtok::TokKind LexIdentifier();
115  bool LexInclude();
116  tgtok::TokKind LexString();
117  tgtok::TokKind LexVarName();
118  tgtok::TokKind LexNumber();
119  tgtok::TokKind LexBracket();
120  tgtok::TokKind LexExclaim();
121};
122
123} // end namespace llvm
124
125#endif
126