text: //===- TGLexer.h - Lexer for TableGen Files ---------------------*- C++ -*-===//
  //
  //                     The LLVM Compiler Infrastructure
  //
  // This file is distributed under the University of Illinois Open Source
  // License. See LICENSE.TXT for details.
  //
  //===----------------------------------------------------------------------===//
  //
  // This class represents the Lexer for tablegen files.
  //
  //===----------------------------------------------------------------------===//
  
  #ifndef TGLEXER_H
  #define TGLEXER_H
  
  #include "llvm/Support/DataTypes.h"
  #include "llvm/Support/SMLoc.h"
  #include <cassert>
  #include <map>
  #include <string>
  
  namespace llvm {
  class MemoryBuffer;
  class SourceMgr;
  class SMLoc;
  class Twine;
  
  namespace tgtok {
    enum TokKind {
      // Markers
      Eof, Error,
      
      // Tokens with no info.
      minus, plus,        // - +
      l_square, r_square, // [ ]
      l_brace, r_brace,   // { }
      l_paren, r_paren,   // ( )
      less, greater,      // < >
      colon, semi,        // : ;
      comma, period,      // , .
      equal, question,    // = ?
      paste,              // #
  
      // Keywords.
      Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List,
      MultiClass, String,
      
      // !keywords.
      XConcat, XADD, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst,
      XForEach, XHead, XTail, XEmpty, XIf, XEq,
  
      // Integer value.
      IntVal,
      
      // String valued tokens.
      Id, StrVal, VarName, CodeFragment
    };
  }
  
  /// TGLexer - TableGen Lexer class.
  class TGLexer {
    SourceMgr &SrcMgr;
    
    const char *CurPtr;
    const MemoryBuffer *CurBuf;
  
    // Information about the current token.
    const char *TokStart;
    tgtok::TokKind CurCode;
    std::string CurStrVal;  // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT
    int64_t CurIntVal;      // This is valid for INTVAL.
  
    /// CurBuffer - This is the current buffer index we're lexing from as managed
    /// by the SourceMgr object.
    int CurBuffer;
  
  public:
    typedef std::map<std::string, SMLoc> DependenciesMapTy;
  private:
    /// Dependencies - This is the list of all included files.
    DependenciesMapTy Dependencies;
  
  public:
    TGLexer(SourceMgr &SrcMgr);
    ~TGLexer() {}
    
    tgtok::TokKind Lex() {
      return CurCode = LexToken();
    }
  
    const DependenciesMapTy &getDependencies() const {
      return Dependencies;
    }
    
    tgtok::TokKind getCode() const { return CurCode; }
  
    const std::string &getCurStrVal() const {
      assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal || 
              CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) &&
             "This token doesn't have a string value");
      return CurStrVal;
    }
    int64_t getCurIntVal() const {
      assert(CurCode == tgtok::IntVal && "This token isn't an integer");
      return CurIntVal;
    }
  
    SMLoc getLoc() const;
    
  private:
    /// LexToken - Read the next token and return its code.
    tgtok::TokKind LexToken();
    
    tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg);
    
    int getNextChar();
    int peekNextChar(int Index);
    void SkipBCPLComment();
    bool SkipCComment();
    tgtok::TokKind LexIdentifier();
    bool LexInclude();
    tgtok::TokKind LexString();
    tgtok::TokKind LexVarName();
    tgtok::TokKind LexNumber();
    tgtok::TokKind LexBracket();
    tgtok::TokKind LexExclaim();
  };
    
  } // end namespace llvm
  
  #endif
  