//===- ScriptLexer.h --------------------------------------------*- 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 // //===----------------------------------------------------------------------===// #ifndef LLD_ELF_SCRIPT_LEXER_H #define LLD_ELF_SCRIPT_LEXER_H #include "lld/Common/LLVM.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/MemoryBufferRef.h" #include namespace lld::elf { class ScriptLexer { protected: struct Buffer { // The remaining content to parse and the filename. StringRef s, filename; const char *begin = nullptr; size_t lineNumber = 1; // True if the script is opened as an absolute path under the --sysroot // directory. bool isUnderSysroot = false; Buffer() = default; Buffer(MemoryBufferRef mb); }; // The current buffer and parent buffers due to INCLUDE. Buffer curBuf; SmallVector buffers; // Used to detect INCLUDE() cycles. llvm::DenseSet activeFilenames; struct Token { StringRef str; explicit operator bool() const { return !str.empty(); } operator StringRef() const { return str; } }; // The token before the last next(). StringRef prevTok; // Rules for what is a token are different when we are in an expression. // curTok holds the cached return value of peek() and is invalid when the // expression state changes. StringRef curTok; size_t prevTokLine = 1; // The inExpr state when curTok is cached. bool curTokState = false; bool eof = false; public: explicit ScriptLexer(MemoryBufferRef mb); void setError(const Twine &msg); void lex(); StringRef skipSpace(StringRef s); bool atEOF(); StringRef next(); StringRef peek(); void skip(); bool consume(StringRef tok); void expect(StringRef expect); Token till(StringRef tok); std::string getCurrentLocation(); MemoryBufferRef getCurrentMB(); std::vector mbs; bool inExpr = false; private: StringRef getLine(); size_t getColumnNumber(); }; } // namespace lld::elf #endif