//===- LLLexer.h - Lexer for LLVM Assembly 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 .ll files. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_ASMPARSER_LLLEXER_H #define LLVM_LIB_ASMPARSER_LLLEXER_H #include "LLToken.h" #include "llvm/ADT/APFloat.h" #include "llvm/ADT/APSInt.h" #include "llvm/Support/SourceMgr.h" #include <string> namespace llvm { class MemoryBuffer; class Type; class SMDiagnostic; class LLVMContext; class LLLexer { const char *CurPtr; StringRef CurBuf; SMDiagnostic &ErrorInfo; SourceMgr &SM; LLVMContext &Context; // Information about the current token. const char *TokStart; lltok::Kind CurKind; std::string StrVal; unsigned UIntVal; Type *TyVal; APFloat APFloatVal; APSInt APSIntVal; // When false (default), an identifier ending in ':' is a label token. // When true, the ':' is treated as a separate token. bool IgnoreColonInIdentifiers; public: explicit LLLexer(StringRef StartBuf, SourceMgr &SM, SMDiagnostic &, LLVMContext &C); lltok::Kind Lex() { return CurKind = LexToken(); } typedef SMLoc LocTy; LocTy getLoc() const { return SMLoc::getFromPointer(TokStart); } lltok::Kind getKind() const { return CurKind; } const std::string &getStrVal() const { return StrVal; } Type *getTyVal() const { return TyVal; } unsigned getUIntVal() const { return UIntVal; } const APSInt &getAPSIntVal() const { return APSIntVal; } const APFloat &getAPFloatVal() const { return APFloatVal; } void setIgnoreColonInIdentifiers(bool val) { IgnoreColonInIdentifiers = val; } bool Error(LocTy ErrorLoc, const Twine &Msg) const; bool Error(const Twine &Msg) const { return Error(getLoc(), Msg); } void Warning(LocTy WarningLoc, const Twine &Msg) const; void Warning(const Twine &Msg) const { return Warning(getLoc(), Msg); } private: lltok::Kind LexToken(); int getNextChar(); void SkipLineComment(); lltok::Kind ReadString(lltok::Kind kind); bool ReadVarName(); lltok::Kind LexIdentifier(); lltok::Kind LexDigitOrNegative(); lltok::Kind LexPositive(); lltok::Kind LexAt(); lltok::Kind LexDollar(); lltok::Kind LexExclaim(); lltok::Kind LexPercent(); lltok::Kind LexUIntID(lltok::Kind Token); lltok::Kind LexVar(lltok::Kind Var, lltok::Kind VarID); lltok::Kind LexQuote(); lltok::Kind Lex0x(); lltok::Kind LexHash(); lltok::Kind LexCaret(); uint64_t atoull(const char *Buffer, const char *End); uint64_t HexIntToVal(const char *Buffer, const char *End); void HexToIntPair(const char *Buffer, const char *End, uint64_t Pair[2]); void FP80HexToIntPair(const char *Buffer, const char *End, uint64_t Pair[2]); }; } // end namespace llvm #endif