1a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//===- TGLexer.h - Lexer for TableGen Files ---------------------*- C++ -*-===//
2a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//
3a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//                     The LLVM Compiler Infrastructure
4a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//
53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source
63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details.
7a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//
8a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//===----------------------------------------------------------------------===//
9a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//
10a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner// This class represents the Lexer for tablegen files.
11a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//
12a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner//===----------------------------------------------------------------------===//
13a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
14a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#ifndef TGLEXER_H
15a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#define TGLEXER_H
16a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/ADT/StringRef.h"
183cc52ea33c0b96d1682f14fc45c45b57df0f39b6Michael J. Spencer#include "llvm/Support/DataTypes.h"
19a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva#include "llvm/Support/SMLoc.h"
20a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include <cassert>
21a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva#include <map>
22a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#include <string>
23a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
24a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnernamespace llvm {
258070ea3f068980d08cc10381f4c9369d19a91353Chris Lattnerclass SourceMgr;
261e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattnerclass SMLoc;
27d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramerclass Twine;
28d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer
29f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnernamespace tgtok {
30f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  enum TokKind {
31f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // Markers
32f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    Eof, Error,
33f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
34f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // Tokens with no info.
35f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    minus, plus,        // - +
36f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    l_square, r_square, // [ ]
37f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    l_brace, r_brace,   // { }
38f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    l_paren, r_paren,   // ( )
39f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    less, greater,      // < >
40606957fdd69f5ee1a561cd8acd070623f8ec9a21Francois Pichet    colon, semi,        // : ;
41f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    comma, period,      // , .
42f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    equal, question,    // = ?
43d3d1cad535d1c88e13e8e082c136260ee624967fDavid Greene    paste,              // #
44d3d1cad535d1c88e13e8e082c136260ee624967fDavid Greene
45f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // Keywords.
46cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene    Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List,
47f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    MultiClass, String,
48f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
49f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // !keywords.
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    XConcat, XADD, XSRA, XSRL, XSHL, XListConcat, XStrConcat, XCast, XSubst,
511434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene    XForEach, XHead, XTail, XEmpty, XIf, XEq,
52c7cafcd815519b06318629b424abe746437e1389David Greene
53f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // Integer value.
54f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    IntVal,
55f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
56f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // String valued tokens.
57f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    Id, StrVal, VarName, CodeFragment
58f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  };
59f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner}
60a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
61f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner/// TGLexer - TableGen Lexer class.
62a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerclass TGLexer {
638070ea3f068980d08cc10381f4c9369d19a91353Chris Lattner  SourceMgr &SrcMgr;
64aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner
65a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner  const char *CurPtr;
66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringRef CurBuf;
67a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
68f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  // Information about the current token.
69f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  const char *TokStart;
70f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind CurCode;
71f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::string CurStrVal;  // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT
7263f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  int64_t CurIntVal;      // This is valid for INTVAL.
73aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner
74aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner  /// CurBuffer - This is the current buffer index we're lexing from as managed
75aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner  /// by the SourceMgr object.
76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned CurBuffer;
77a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva
78a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silvapublic:
79a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva  typedef std::map<std::string, SMLoc> DependenciesMapTy;
80a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silvaprivate:
81dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger  /// Dependencies - This is the list of all included files.
82a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva  DependenciesMapTy Dependencies;
83a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva
84a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerpublic:
858070ea3f068980d08cc10381f4c9369d19a91353Chris Lattner  TGLexer(SourceMgr &SrcMgr);
86aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner  ~TGLexer() {}
87a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
88f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind Lex() {
89f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return CurCode = LexToken();
90f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
91dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger
92a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva  const DependenciesMapTy &getDependencies() const {
93dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger    return Dependencies;
94dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger  }
95f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
96f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind getCode() const { return CurCode; }
97a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
98f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  const std::string &getCurStrVal() const {
99f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal ||
100f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner            CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) &&
101f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner           "This token doesn't have a string value");
102f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return CurStrVal;
103f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
10463f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  int64_t getCurIntVal() const {
105f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    assert(CurCode == tgtok::IntVal && "This token isn't an integer");
106f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return CurIntVal;
107f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
10856a9fcfd1e19c7adfcc4c948e2f5e471ca8ed241Chris Lattner
1091e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner  SMLoc getLoc() const;
110c8a9bbcbc777f5071ed67879b9f6f3b02c5d1e34Chris Lattner
111a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerprivate:
112f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  /// LexToken - Read the next token and return its code.
113f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexToken();
114f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
115d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer  tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg);
116c8a9bbcbc777f5071ed67879b9f6f3b02c5d1e34Chris Lattner
117a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner  int getNextChar();
118a761f92cd38572dd65cc995c5f59b9c2c0f51068David Greene  int peekNextChar(int Index);
119a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner  void SkipBCPLComment();
120a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner  bool SkipCComment();
121f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexIdentifier();
122a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner  bool LexInclude();
123f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexString();
124f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexVarName();
125f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexNumber();
126f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexBracket();
127f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexExclaim();
128a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner};
129a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
130a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner} // end namespace llvm
131a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
132a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#endif
133