1 //===--- PTHLexer.h - Lexer based on Pre-tokenized input --------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the PTHLexer interface.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_LEX_PTHLEXER_H
15 #define LLVM_CLANG_LEX_PTHLEXER_H
17 #include "clang/Lex/PreprocessorLexer.h"
22 class PTHSpellingSearch;
24 class PTHLexer : public PreprocessorLexer {
25 SourceLocation FileStartLoc;
27 /// TokBuf - Buffer from PTH file containing raw token data.
28 const unsigned char* TokBuf;
30 /// CurPtr - Pointer into current offset of the token buffer where
31 /// the next token will be read.
32 const unsigned char* CurPtr;
34 /// LastHashTokPtr - Pointer into TokBuf of the last processed '#'
35 /// token that appears at the start of a line.
36 const unsigned char* LastHashTokPtr;
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;
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;
47 PTHLexer(const PTHLexer &) = delete;
48 void operator=(const PTHLexer &) = delete;
50 /// ReadToken - Used by PTHLexer to read tokens TokBuf.
51 void ReadToken(Token& T);
53 bool LexEndOfFile(Token &Result);
55 /// PTHMgr - The PTHManager object that created this PTHLexer.
61 friend class PTHManager;
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);
67 ~PTHLexer() override {}
69 /// Lex - Return the next token.
72 void getEOF(Token &Tok);
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();
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.
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
86 tok::TokenKind x = (tok::TokenKind)*CurPtr;
87 return x == tok::eof ? 2 : x == tok::l_paren;
90 /// IndirectLex - An indirect call to 'Lex' that can be invoked via
91 /// the PreprocessorLexer interface.
92 void IndirectLex(Token &Result) override { Lex(Result); }
94 /// getSourceLocation - Return a source location for the token in
96 SourceLocation getSourceLocation() override;
98 /// SkipBlock - Used by Preprocessor to skip the current conditional block.
102 } // end namespace clang