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
173cc52ea33c0b96d1682f14fc45c45b57df0f39b6Michael J. Spencer#include "llvm/Support/DataTypes.h"
18a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#include <string>
19dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger#include <vector>
208dcf7513105fee939605eb98d86600ec279e3891Chris Lattner#include <cassert>
21a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
22a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnernamespace llvm {
23a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerclass MemoryBuffer;
248070ea3f068980d08cc10381f4c9369d19a91353Chris Lattnerclass SourceMgr;
251e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattnerclass SMLoc;
26d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramerclass Twine;
27d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer
28f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnernamespace tgtok {
29f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  enum TokKind {
30f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // Markers
31f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    Eof, Error,
32f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
33f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // Tokens with no info.
34f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    minus, plus,        // - +
35f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    l_square, r_square, // [ ]
36f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    l_brace, r_brace,   // { }
37f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    l_paren, r_paren,   // ( )
38f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    less, greater,      // < >
39606957fdd69f5ee1a561cd8acd070623f8ec9a21Francois Pichet    colon, semi,        // : ;
40f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    comma, period,      // , .
41f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    equal, question,    // = ?
42d3d1cad535d1c88e13e8e082c136260ee624967fDavid Greene    paste,              // #
43d3d1cad535d1c88e13e8e082c136260ee624967fDavid Greene
44f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // Keywords.
45cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene    Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List,
46f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    MultiClass, String,
47f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
48f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // !keywords.
49c7252ce74324e44efa7ec2506035a8e2d2e93d2fChris Lattner    XConcat, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst,
501434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene    XForEach, XHead, XTail, XEmpty, XIf, XEq,
51c7cafcd815519b06318629b424abe746437e1389David Greene
52f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // Integer value.
53f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    IntVal,
54f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
55f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    // String valued tokens.
56f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    Id, StrVal, VarName, CodeFragment
57f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  };
58f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner}
59a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
60f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner/// TGLexer - TableGen Lexer class.
61a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerclass TGLexer {
628070ea3f068980d08cc10381f4c9369d19a91353Chris Lattner  SourceMgr &SrcMgr;
63aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner
64a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner  const char *CurPtr;
65aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner  const MemoryBuffer *CurBuf;
66a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
67f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  // Information about the current token.
68f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  const char *TokStart;
69f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind CurCode;
70f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::string CurStrVal;  // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT
7163f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  int64_t CurIntVal;      // This is valid for INTVAL.
72aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner
73aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner  /// CurBuffer - This is the current buffer index we're lexing from as managed
74aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner  /// by the SourceMgr object.
75aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner  int CurBuffer;
76dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger  /// Dependencies - This is the list of all included files.
77dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger  std::vector<std::string> Dependencies;
78a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
79a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerpublic:
808070ea3f068980d08cc10381f4c9369d19a91353Chris Lattner  TGLexer(SourceMgr &SrcMgr);
81aa739d26b1e65aec7f9afa1cde7e069c081ea355Chris Lattner  ~TGLexer() {}
82a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
83f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind Lex() {
84f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return CurCode = LexToken();
85f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
86dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger
87dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger  const std::vector<std::string> &getDependencies() const {
88dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger    return Dependencies;
89dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger  }
90f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
91f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind getCode() const { return CurCode; }
92a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
93f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  const std::string &getCurStrVal() const {
94f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal ||
95f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner            CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) &&
96f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner           "This token doesn't have a string value");
97f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return CurStrVal;
98f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
9963f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  int64_t getCurIntVal() const {
100f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    assert(CurCode == tgtok::IntVal && "This token isn't an integer");
101f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return CurIntVal;
102f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
10356a9fcfd1e19c7adfcc4c948e2f5e471ca8ed241Chris Lattner
1041e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner  SMLoc getLoc() const;
105c8a9bbcbc777f5071ed67879b9f6f3b02c5d1e34Chris Lattner
106a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattnerprivate:
107f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  /// LexToken - Read the next token and return its code.
108f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexToken();
109f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
110d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer  tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg);
111c8a9bbcbc777f5071ed67879b9f6f3b02c5d1e34Chris Lattner
112a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner  int getNextChar();
113a761f92cd38572dd65cc995c5f59b9c2c0f51068David Greene  int peekNextChar(int Index);
114a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner  void SkipBCPLComment();
115a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner  bool SkipCComment();
116f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexIdentifier();
117a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner  bool LexInclude();
118f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexString();
119f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexVarName();
120f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexNumber();
121f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexBracket();
122f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  tgtok::TokKind LexExclaim();
123a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner};
124a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
125a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner} // end namespace llvm
126a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner
127a8058744229a44e80f90c8530bb7fe47cbab1b70Chris Lattner#endif
128