| //===- 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 LLVM_LIB_TABLEGEN_TGLEXER_H |
| #define LLVM_LIB_TABLEGEN_TGLEXER_H |
| |
| #include "llvm/ADT/StringRef.h" |
| #include "llvm/Support/DataTypes.h" |
| #include "llvm/Support/SMLoc.h" |
| #include <cassert> |
| #include <map> |
| #include <string> |
| |
| namespace llvm { |
| 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, Defset, |
| |
| // !keywords. |
| XConcat, XADD, XAND, XOR, XSRA, XSRL, XSHL, XListConcat, XStrConcat, XCast, |
| XSubst, XForEach, XFoldl, XHead, XTail, XSize, XEmpty, XIf, XEq, XIsA, XDag, |
| XNe, XLe, XLt, XGe, XGt, |
| |
| // Integer value. |
| IntVal, |
| |
| // Binary constant. Note that these are sized according to the number of |
| // bits given. |
| BinaryIntVal, |
| |
| // String valued tokens. |
| Id, StrVal, VarName, CodeFragment |
| }; |
| } |
| |
| /// TGLexer - TableGen Lexer class. |
| class TGLexer { |
| SourceMgr &SrcMgr; |
| |
| const char *CurPtr; |
| StringRef 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. |
| unsigned 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); |
| |
| 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; |
| } |
| std::pair<int64_t, unsigned> getCurBinaryIntVal() const { |
| assert(CurCode == tgtok::BinaryIntVal && |
| "This token isn't a binary integer"); |
| return std::make_pair(CurIntVal, (CurPtr - TokStart)-2); |
| } |
| |
| 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 |