File indexing completed on 2026-05-10 08:44:11
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_MC_MCPARSER_MCASMLEXER_H
0010 #define LLVM_MC_MCPARSER_MCASMLEXER_H
0011
0012 #include "llvm/ADT/ArrayRef.h"
0013 #include "llvm/ADT/SmallVector.h"
0014 #include "llvm/MC/MCAsmMacro.h"
0015 #include <cassert>
0016 #include <cstddef>
0017 #include <string>
0018
0019 namespace llvm {
0020
0021
0022
0023 class AsmCommentConsumer {
0024 public:
0025 virtual ~AsmCommentConsumer() = default;
0026
0027
0028
0029
0030
0031 virtual void HandleComment(SMLoc Loc, StringRef CommentText) = 0;
0032 };
0033
0034
0035
0036
0037 class MCAsmLexer {
0038
0039 SmallVector<AsmToken, 1> CurTok;
0040
0041
0042 SMLoc ErrLoc;
0043 std::string Err;
0044
0045 protected:
0046 const char *TokStart = nullptr;
0047 bool SkipSpace = true;
0048 bool AllowAtInIdentifier = false;
0049 bool AllowHashInIdentifier = false;
0050 bool IsAtStartOfStatement = true;
0051 bool LexMasmHexFloats = false;
0052 bool LexMasmIntegers = false;
0053 bool LexMasmStrings = false;
0054 bool LexMotorolaIntegers = false;
0055 bool UseMasmDefaultRadix = false;
0056 unsigned DefaultRadix = 10;
0057 bool LexHLASMIntegers = false;
0058 bool LexHLASMStrings = false;
0059 AsmCommentConsumer *CommentConsumer = nullptr;
0060
0061 MCAsmLexer();
0062
0063 virtual AsmToken LexToken() = 0;
0064
0065 void SetError(SMLoc errLoc, const std::string &err) {
0066 ErrLoc = errLoc;
0067 Err = err;
0068 }
0069
0070 public:
0071 MCAsmLexer(const MCAsmLexer &) = delete;
0072 MCAsmLexer &operator=(const MCAsmLexer &) = delete;
0073 virtual ~MCAsmLexer();
0074
0075
0076
0077
0078
0079 const AsmToken &Lex() {
0080 assert(!CurTok.empty());
0081
0082 IsAtStartOfStatement = CurTok.front().getKind() == AsmToken::EndOfStatement;
0083 CurTok.erase(CurTok.begin());
0084
0085
0086 if (CurTok.empty()) {
0087 AsmToken T = LexToken();
0088 CurTok.insert(CurTok.begin(), T);
0089 }
0090 return CurTok.front();
0091 }
0092
0093 void UnLex(AsmToken const &Token) {
0094 IsAtStartOfStatement = false;
0095 CurTok.insert(CurTok.begin(), Token);
0096 }
0097
0098 bool isAtStartOfStatement() { return IsAtStartOfStatement; }
0099
0100 virtual StringRef LexUntilEndOfStatement() = 0;
0101
0102
0103 SMLoc getLoc() const;
0104
0105
0106 const AsmToken &getTok() const {
0107 return CurTok[0];
0108 }
0109
0110
0111 const AsmToken peekTok(bool ShouldSkipSpace = true) {
0112 AsmToken Tok;
0113
0114 MutableArrayRef<AsmToken> Buf(Tok);
0115 size_t ReadCount = peekTokens(Buf, ShouldSkipSpace);
0116
0117 assert(ReadCount == 1);
0118 (void)ReadCount;
0119
0120 return Tok;
0121 }
0122
0123
0124 virtual size_t peekTokens(MutableArrayRef<AsmToken> Buf,
0125 bool ShouldSkipSpace = true) = 0;
0126
0127
0128 SMLoc getErrLoc() {
0129 return ErrLoc;
0130 }
0131
0132
0133 const std::string &getErr() {
0134 return Err;
0135 }
0136
0137
0138 AsmToken::TokenKind getKind() const { return getTok().getKind(); }
0139
0140
0141 bool is(AsmToken::TokenKind K) const { return getTok().is(K); }
0142
0143
0144 bool isNot(AsmToken::TokenKind K) const { return getTok().isNot(K); }
0145
0146
0147 void setSkipSpace(bool val) { SkipSpace = val; }
0148
0149 bool getAllowAtInIdentifier() { return AllowAtInIdentifier; }
0150 void setAllowAtInIdentifier(bool v) { AllowAtInIdentifier = v; }
0151
0152 void setAllowHashInIdentifier(bool V) { AllowHashInIdentifier = V; }
0153
0154 void setCommentConsumer(AsmCommentConsumer *CommentConsumer) {
0155 this->CommentConsumer = CommentConsumer;
0156 }
0157
0158
0159
0160 void setLexMasmIntegers(bool V) { LexMasmIntegers = V; }
0161
0162
0163
0164 void useMasmDefaultRadix(bool V) { UseMasmDefaultRadix = V; }
0165
0166 unsigned getMasmDefaultRadix() const { return DefaultRadix; }
0167 void setMasmDefaultRadix(unsigned Radix) { DefaultRadix = Radix; }
0168
0169
0170 void setLexMasmHexFloats(bool V) { LexMasmHexFloats = V; }
0171
0172
0173
0174 void setLexMasmStrings(bool V) { LexMasmStrings = V; }
0175
0176
0177
0178 void setLexMotorolaIntegers(bool V) { LexMotorolaIntegers = V; }
0179
0180
0181 void setLexHLASMIntegers(bool V) { LexHLASMIntegers = V; }
0182
0183
0184
0185
0186 void setLexHLASMStrings(bool V) { LexHLASMStrings = V; }
0187 };
0188
0189 }
0190
0191 #endif