| //===- LLLexer.h - Lexer for LLVM Assembly Files ----------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // 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 |