18e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===- LLLexer.h - Lexer for LLVM Assembly Files ----------------*- C++ -*-===//
28e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
38e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//                     The LLVM Compiler Infrastructure
48e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
78e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
88e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===//
98e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// This class represents the Lexer for .ll files.
118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===//
138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#ifndef LIB_ASMPARSER_LLLEXER_H
158e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#define LIB_ASMPARSER_LLLEXER_H
168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
17df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "LLToken.h"
18df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/ADT/APSInt.h"
19df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/ADT/APFloat.h"
20eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner#include "llvm/Support/SourceMgr.h"
215679d18c54ef46170e46f51bf471bb334f2b6525Misha Brukman#include <string>
228e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
238e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnernamespace llvm {
248e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  class MemoryBuffer;
25df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  class Type;
2692bcb426c3e4503c99324afd4ed0a73521711a56Chris Lattner  class SMDiagnostic;
2712ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramer  class LLVMContext;
289ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman
298e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  class LLLexer {
308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    const char *CurPtr;
318e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    MemoryBuffer *CurBuf;
3292bcb426c3e4503c99324afd4ed0a73521711a56Chris Lattner    SMDiagnostic &ErrorInfo;
33eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner    SourceMgr &SM;
34ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson    LLVMContext &Context;
35df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
36df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    // Information about the current token.
378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    const char *TokStart;
38df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind CurKind;
39df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    std::string StrVal;
40df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    unsigned UIntVal;
411afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner    Type *TyVal;
42df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    APFloat APFloatVal;
43df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    APSInt  APSIntVal;
449ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman
458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  public:
46ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson    explicit LLLexer(MemoryBuffer *StartBuf, SourceMgr &SM, SMDiagnostic &,
47ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson                     LLVMContext &C);
488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    ~LLLexer() {}
498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
50df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind Lex() {
51df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      return CurKind = LexToken();
52df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    }
53df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
54eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner    typedef SMLoc LocTy;
55eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner    LocTy getLoc() const { return SMLoc::getFromPointer(TokStart); }
56df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind getKind() const { return CurKind; }
5773180c5355bff75b2d9b0e1349f0898e4e60fe89Chris Lattner    const std::string &getStrVal() const { return StrVal; }
581afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner    Type *getTyVal() const { return TyVal; }
59df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    unsigned getUIntVal() const { return UIntVal; }
60df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    const APSInt &getAPSIntVal() const { return APSIntVal; }
61df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    const APFloat &getAPFloatVal() const { return APFloatVal; }
62df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
639ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman
64d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer    bool Error(LocTy L, const Twine &Msg) const;
65d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer    bool Error(const Twine &Msg) const { return Error(getLoc(), Msg); }
66df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    std::string getFilename() const;
679ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman
688e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  private:
69df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind LexToken();
70df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    int getNextChar();
728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    void SkipLineComment();
739fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky    lltok::Kind ReadString(lltok::Kind kind);
749fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky    bool ReadVarName();
759fa89334f1045b56e8ae409004e119d47ef17ec7Nick Lewycky
76df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind LexIdentifier();
77df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind LexDigitOrNegative();
78df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind LexPositive();
79df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind LexAt();
80e434d277ca5183eeb6f881000732dcf4c8edd52eChris Lattner    lltok::Kind LexExclaim();
81df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind LexPercent();
82df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind LexQuote();
83df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    lltok::Kind Lex0x();
849ea4034e007a83c778cd306ea66481be1317a51bMisha Brukman
85df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    uint64_t atoull(const char *Buffer, const char *End);
86df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    uint64_t HexIntToVal(const char *Buffer, const char *End);
87df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    void HexToIntPair(const char *Buffer, const char *End, uint64_t Pair[2]);
881b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen    void FP80HexToIntPair(const char *Buff, const char *End, uint64_t Pair[2]);
898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  };
908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} // end namespace llvm
918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#endif
93