1 //===- Lexer.h - MLIR Lexer Interface ---------------------------*- 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 file declares the MLIR Lexer class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef MLIR_LIB_ASMPARSER_LEXER_H 14 #define MLIR_LIB_ASMPARSER_LEXER_H 15 16 #include "Token.h" 17 #include "mlir/AsmParser/AsmParser.h" 18 19 namespace mlir { 20 class Location; 21 22 /// This class breaks up the current file into a token stream. 23 class Lexer { 24 public: 25 explicit Lexer(const llvm::SourceMgr &sourceMgr, MLIRContext *context, 26 AsmParserCodeCompleteContext *codeCompleteContext); 27 getSourceMgr()28 const llvm::SourceMgr &getSourceMgr() { return sourceMgr; } 29 30 Token lexToken(); 31 32 /// Encode the specified source location information into a Location object 33 /// for attachment to the IR or error reporting. 34 Location getEncodedSourceLocation(SMLoc loc); 35 36 /// Change the position of the lexer cursor. The next token we lex will start 37 /// at the designated point in the input. resetPointer(const char * newPointer)38 void resetPointer(const char *newPointer) { curPtr = newPointer; } 39 40 /// Returns the start of the buffer. getBufferBegin()41 const char *getBufferBegin() { return curBuffer.data(); } 42 43 /// Return the code completion location of the lexer, or nullptr if there is 44 /// none. getCodeCompleteLoc()45 const char *getCodeCompleteLoc() const { return codeCompleteLoc; } 46 47 private: 48 // Helpers. formToken(Token::Kind kind,const char * tokStart)49 Token formToken(Token::Kind kind, const char *tokStart) { 50 return Token(kind, StringRef(tokStart, curPtr - tokStart)); 51 } 52 53 Token emitError(const char *loc, const Twine &message); 54 55 // Lexer implementation methods. 56 Token lexAtIdentifier(const char *tokStart); 57 Token lexBareIdentifierOrKeyword(const char *tokStart); 58 Token lexEllipsis(const char *tokStart); 59 Token lexNumber(const char *tokStart); 60 Token lexPrefixedIdentifier(const char *tokStart); 61 Token lexString(const char *tokStart); 62 63 /// Skip a comment line, starting with a '//'. 64 void skipComment(); 65 66 const llvm::SourceMgr &sourceMgr; 67 MLIRContext *context; 68 69 StringRef curBuffer; 70 const char *curPtr; 71 72 /// An optional code completion point within the input file, used to indicate 73 /// the position of a code completion token. 74 const char *codeCompleteLoc; 75 76 Lexer(const Lexer &) = delete; 77 void operator=(const Lexer &) = delete; 78 }; 79 80 } // namespace mlir 81 82 #endif // MLIR_LIB_ASMPARSER_LEXER_H 83