119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===- TGLexer.h - Lexer for TableGen Files ---------------------*- C++ -*-===//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This class represents the Lexer for tablegen files.
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#ifndef TGLEXER_H
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define TGLEXER_H
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/DataTypes.h"
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include <string>
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include <vector>
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include <cassert>
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm {
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass MemoryBuffer;
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass SourceMgr;
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass SMLoc;
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass Twine;
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace tgtok {
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  enum TokKind {
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Markers
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Eof, Error,
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Tokens with no info.
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    minus, plus,        // - +
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    l_square, r_square, // [ ]
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    l_brace, r_brace,   // { }
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    l_paren, r_paren,   // ( )
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    less, greater,      // < >
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    colon, semi,        // : ;
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    comma, period,      // , .
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    equal, question,    // = ?
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Keywords.
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Bit, Bits, Class, Code, Dag, Def, Defm, Field, In, Int, Let, List,
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MultiClass, String,
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // !keywords.
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    XConcat, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst,
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    XForEach, XHead, XTail, XEmpty, XIf, XEq,
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Integer value.
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    IntVal,
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // String valued tokens.
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Id, StrVal, VarName, CodeFragment
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  };
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// TGLexer - TableGen Lexer class.
6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass TGLexer {
6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SourceMgr &SrcMgr;
6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const char *CurPtr;
6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MemoryBuffer *CurBuf;
6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Information about the current token.
6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const char *TokStart;
6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind CurCode;
6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  std::string CurStrVal;  // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT
7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  int64_t CurIntVal;      // This is valid for INTVAL.
7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// CurBuffer - This is the current buffer index we're lexing from as managed
7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// by the SourceMgr object.
7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  int CurBuffer;
7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// Dependencies - This is the list of all included files.
7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  std::vector<std::string> Dependencies;
7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic:
7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TGLexer(SourceMgr &SrcMgr);
8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ~TGLexer() {}
8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind Lex() {
8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return CurCode = LexToken();
8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const std::vector<std::string> &getDependencies() const {
8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return Dependencies;
8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind getCode() const { return CurCode; }
9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const std::string &getCurStrVal() const {
9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal ||
9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) &&
9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman           "This token doesn't have a string value");
9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return CurStrVal;
9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  int64_t getCurIntVal() const {
9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    assert(CurCode == tgtok::IntVal && "This token isn't an integer");
10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return CurIntVal;
10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SMLoc getLoc() const;
10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanprivate:
10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// LexToken - Read the next token and return its code.
10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind LexToken();
10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg);
11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  int getNextChar();
11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void SkipBCPLComment();
11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool SkipCComment();
11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind LexIdentifier();
11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool LexInclude();
11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind LexString();
11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind LexVarName();
11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind LexNumber();
11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind LexBracket();
12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  tgtok::TokKind LexExclaim();
12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // end namespace llvm
12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#endif
126