1 //===- AsmLexer.h - Lexer for Assembly Files --------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This class declares the lexer for assembly files.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_MC_MCPARSER_ASMLEXER_H
14 #define LLVM_MC_MCPARSER_ASMLEXER_H
15 
16 #include "llvm/ADT/StringRef.h"
17 #include "llvm/MC/MCParser/MCAsmLexer.h"
18 #include <string>
19 
20 namespace llvm {
21 
22 class MCAsmInfo;
23 
24 /// AsmLexer - Lexer class for assembly files.
25 class AsmLexer : public MCAsmLexer {
26   const MCAsmInfo &MAI;
27 
28   const char *CurPtr = nullptr;
29   StringRef CurBuf;
30   bool IsAtStartOfLine = true;
31   bool IsAtStartOfStatement = true;
32   bool IsPeeking = false;
33   bool EndStatementAtEOF = true;
34 
35 protected:
36   /// LexToken - Read the next token and return its code.
37   AsmToken LexToken() override;
38 
39 public:
40   AsmLexer(const MCAsmInfo &MAI);
41   AsmLexer(const AsmLexer &) = delete;
42   AsmLexer &operator=(const AsmLexer &) = delete;
43   ~AsmLexer() override;
44 
45   void setBuffer(StringRef Buf, const char *ptr = nullptr,
46                  bool EndStatementAtEOF = true);
47 
48   StringRef LexUntilEndOfStatement() override;
49 
50   size_t peekTokens(MutableArrayRef<AsmToken> Buf,
51                     bool ShouldSkipSpace = true) override;
52 
53   const MCAsmInfo &getMAI() const { return MAI; }
54 
55 private:
56   bool isAtStartOfComment(const char *Ptr);
57   bool isAtStatementSeparator(const char *Ptr);
58   int getNextChar();
59   int peekNextChar();
60   AsmToken ReturnError(const char *Loc, const std::string &Msg);
61 
62   AsmToken LexIdentifier();
63   AsmToken LexSlash();
64   AsmToken LexLineComment();
65   AsmToken LexDigit();
66   AsmToken LexSingleQuote();
67   AsmToken LexQuote();
68   AsmToken LexFloatLiteral();
69   AsmToken LexHexFloatLiteral(bool NoIntDigits);
70 
71   StringRef LexUntilEndOfLine();
72 };
73 
74 } // end namespace llvm
75 
76 #endif // LLVM_MC_MCPARSER_ASMLEXER_H
77