1 //===--- PTHLexer.h - Lexer based on Pre-tokenized input --------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the PTHLexer interface. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_LEX_PTHLEXER_H 15 #define LLVM_CLANG_LEX_PTHLEXER_H 16 17 #include "clang/Lex/PreprocessorLexer.h" 18 19 namespace clang { 20 21 class PTHManager; 22 class PTHSpellingSearch; 23 24 class PTHLexer : public PreprocessorLexer { 25 SourceLocation FileStartLoc; 26 27 /// TokBuf - Buffer from PTH file containing raw token data. 28 const unsigned char* TokBuf; 29 30 /// CurPtr - Pointer into current offset of the token buffer where 31 /// the next token will be read. 32 const unsigned char* CurPtr; 33 34 /// LastHashTokPtr - Pointer into TokBuf of the last processed '#' 35 /// token that appears at the start of a line. 36 const unsigned char* LastHashTokPtr; 37 38 /// PPCond - Pointer to a side table in the PTH file that provides a 39 /// a consise summary of the preproccessor conditional block structure. 40 /// This is used to perform quick skipping of conditional blocks. 41 const unsigned char* PPCond; 42 43 /// CurPPCondPtr - Pointer inside PPCond that refers to the next entry 44 /// to process when doing quick skipping of preprocessor blocks. 45 const unsigned char* CurPPCondPtr; 46 47 PTHLexer(const PTHLexer &) = delete; 48 void operator=(const PTHLexer &) = delete; 49 50 /// ReadToken - Used by PTHLexer to read tokens TokBuf. 51 void ReadToken(Token& T); 52 53 bool LexEndOfFile(Token &Result); 54 55 /// PTHMgr - The PTHManager object that created this PTHLexer. 56 PTHManager& PTHMgr; 57 58 Token EofToken; 59 60 protected: 61 friend class PTHManager; 62 63 /// Create a PTHLexer for the specified token stream. 64 PTHLexer(Preprocessor& pp, FileID FID, const unsigned char *D, 65 const unsigned char* ppcond, PTHManager &PM); 66 public: ~PTHLexer()67 ~PTHLexer() override {} 68 69 /// Lex - Return the next token. 70 bool Lex(Token &Tok); 71 72 void getEOF(Token &Tok); 73 74 /// DiscardToEndOfLine - Read the rest of the current preprocessor line as an 75 /// uninterpreted string. This switches the lexer out of directive mode. 76 void DiscardToEndOfLine(); 77 78 /// isNextPPTokenLParen - Return 1 if the next unexpanded token will return a 79 /// tok::l_paren token, 0 if it is something else and 2 if there are no more 80 /// tokens controlled by this lexer. isNextPPTokenLParen()81 unsigned isNextPPTokenLParen() { 82 // isNextPPTokenLParen is not on the hot path, and all we care about is 83 // whether or not we are at a token with kind tok::eof or tok::l_paren. 84 // Just read the first byte from the current token pointer to determine 85 // its kind. 86 tok::TokenKind x = (tok::TokenKind)*CurPtr; 87 return x == tok::eof ? 2 : x == tok::l_paren; 88 } 89 90 /// IndirectLex - An indirect call to 'Lex' that can be invoked via 91 /// the PreprocessorLexer interface. IndirectLex(Token & Result)92 void IndirectLex(Token &Result) override { Lex(Result); } 93 94 /// getSourceLocation - Return a source location for the token in 95 /// the current file. 96 SourceLocation getSourceLocation() override; 97 98 /// SkipBlock - Used by Preprocessor to skip the current conditional block. 99 bool SkipBlock(); 100 }; 101 102 } // end namespace clang 103 104 #endif 105