PTHLexer.h revision e36dabb2d9567c98734a1063ac7748dc37a999ce
1274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//===--- PTHLexer.h - Lexer based on Pre-tokenized input --------*- C++ -*-===//
2274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//
3274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//                     The LLVM Compiler Infrastructure
4274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//
5274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// This file is distributed under the University of Illinois Open Source
6274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// License. See LICENSE.TXT for details.
7274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//
8274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//===----------------------------------------------------------------------===//
9274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//
10274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// This file defines the PTHLexer interface.
11274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//
12274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//===----------------------------------------------------------------------===//
13274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
14452e37837a48b2f0ced144784277fd4d28cbede9Ted Kremenek#ifndef LLVM_CLANG_PTHLEXER_H
15452e37837a48b2f0ced144784277fd4d28cbede9Ted Kremenek#define LLVM_CLANG_PTHLEXER_H
16274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
17274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek#include "clang/Lex/PreprocessorLexer.h"
1882a500b141b9a8001dac69f047478a43e2aebdffTed Kremenek#include <vector>
19274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
20274b20863a728cc6a31ee75c670e3733600c1531Ted Kremeneknamespace clang {
21274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
220c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenekclass PTHManager;
230c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek
24274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenekclass PTHLexer : public PreprocessorLexer {
250c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  /// TokBuf - Buffer from PTH file containing raw token data.
260c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  const char* TokBuf;
27cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek
28cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek  /// CurPtr - Pointer into current offset of the token buffer where
29cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek  ///  the next token will be read.
30cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek  const char* CurPtr;
31cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek
32cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek  /// LastHashTokPtr - Pointer into TokBuf of the last processed '#'
33cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek  ///  token that appears at the start of a line.
34cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek  const char* LastHashTokPtr;
35268ee7016a2811803989487c0ad3799486092c63Ted Kremenek
36268ee7016a2811803989487c0ad3799486092c63Ted Kremenek  /// PPCond - Pointer to a side table in the PTH file that provides a
37268ee7016a2811803989487c0ad3799486092c63Ted Kremenek  ///  a consise summary of the preproccessor conditional block structure.
38268ee7016a2811803989487c0ad3799486092c63Ted Kremenek  ///  This is used to perform quick skipping of conditional blocks.
39268ee7016a2811803989487c0ad3799486092c63Ted Kremenek  const char* PPCond;
40268ee7016a2811803989487c0ad3799486092c63Ted Kremenek
41268ee7016a2811803989487c0ad3799486092c63Ted Kremenek  /// CurPPCondPtr - Pointer inside PPCond that refers to the next entry
42268ee7016a2811803989487c0ad3799486092c63Ted Kremenek  ///  to process when doing quick skipping of preprocessor blocks.
43268ee7016a2811803989487c0ad3799486092c63Ted Kremenek  const char* CurPPCondPtr;
4482a500b141b9a8001dac69f047478a43e2aebdffTed Kremenek
45274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  PTHLexer(const PTHLexer&);  // DO NOT IMPLEMENT
46274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  void operator=(const PTHLexer&); // DO NOT IMPLEMENT
470c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek
480c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  /// ReadToken - Used by PTHLexer to read tokens TokBuf.
490c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  void ReadToken(Token& T);
50274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
510c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  /// PTHMgr - The PTHManager object that created this PTHLexer.
520c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  PTHManager& PTHMgr;
530c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek
540c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  Token LastFetched;
550c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  Token EofToken;
560c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  bool NeedsFetching;
570c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek
5882a500b141b9a8001dac69f047478a43e2aebdffTed Kremenekpublic:
59274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
60274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  /// Create a PTHLexer for the specified token stream.
610c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  PTHLexer(Preprocessor& pp, SourceLocation fileloc, const char* D,
62268ee7016a2811803989487c0ad3799486092c63Ted Kremenek           const char* ppcond, PTHManager& PM);
630c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek
64274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  ~PTHLexer() {}
65274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
66274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  /// Lex - Return the next token.
67274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  void Lex(Token &Tok);
68274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
69274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek  void setEOF(Token &Tok);
70274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
719f1384f7db76e24068f6c9d7d881714addb6c029Ted Kremenek  /// DiscardToEndOfLine - Read the rest of the current preprocessor line as an
7217ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek  /// uninterpreted string.  This switches the lexer out of directive mode.
7317ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek  void DiscardToEndOfLine();
742f1c0243f7fc5d12446efcb006c071854c345923Ted Kremenek
752f1c0243f7fc5d12446efcb006c071854c345923Ted Kremenek  /// isNextPPTokenLParen - Return 1 if the next unexpanded token will return a
762f1c0243f7fc5d12446efcb006c071854c345923Ted Kremenek  /// tok::l_paren token, 0 if it is something else and 2 if there are no more
772f1c0243f7fc5d12446efcb006c071854c345923Ted Kremenek  /// tokens controlled by this lexer.
7831aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek  unsigned isNextPPTokenLParen() {
79daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek    // isNextPPTokenLParen is not on the hot path, and all we care about is
80daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek    // whether or not we are at a token with kind tok::eof or tok::l_paren.
81daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek    // Just read the first byte from the current token pointer to determine
82daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek    // its kind.
83e36dabb2d9567c98734a1063ac7748dc37a999ceChris Lattner    tok::TokenKind x = (tok::TokenKind) (unsigned char) *CurPtr;
84daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek    return x == tok::eof ? 2 : x == tok::l_paren;
85daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek  }
8631aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek
87ac2dda65d2d39c0a83d95bdf6237edbf4685bc58Ted Kremenek  /// IndirectLex - An indirect call to 'Lex' that can be invoked via
88ac2dda65d2d39c0a83d95bdf6237edbf4685bc58Ted Kremenek  ///  the PreprocessorLexer interface.
89ac2dda65d2d39c0a83d95bdf6237edbf4685bc58Ted Kremenek  void IndirectLex(Token &Result) { Lex(Result); }
9031aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek
91bc0f6bc0391ecdff331885cdc769c20b2cb628a6Ted Kremenek  /// getSourceLocation - Return a source location for the token in
92bc0f6bc0391ecdff331885cdc769c20b2cb628a6Ted Kremenek  /// the current file.
9330a12ec2a7f331d9e08acabe7cda853aaa7ba54bTed Kremenek  SourceLocation getSourceLocation();
9430a12ec2a7f331d9e08acabe7cda853aaa7ba54bTed Kremenek
95268ee7016a2811803989487c0ad3799486092c63Ted Kremenek  /// SkipBlock - Used by Preprocessor to skip the current conditional block.
96268ee7016a2811803989487c0ad3799486092c63Ted Kremenek  bool SkipBlock();
97268ee7016a2811803989487c0ad3799486092c63Ted Kremenek
98268ee7016a2811803989487c0ad3799486092c63Ted Kremenekprivate:
9931aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek  /// AtLastToken - Returns true if the PTHLexer is at the last token.
1000c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  bool AtLastToken() {
1010c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek    Token T = GetToken();
1020c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek    return T.is(tok::eof) ? EofToken = T, true : false;
1030c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek  }
10431aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek
10531aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek  /// GetToken - Returns the next token.  This method does not advance the
10631aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek  ///  PTHLexer to the next token.
10789d7ee9619d2dbdfa8d956a695c612a104a92cadTed Kremenek  Token GetToken();
10831aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek
10931aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek  /// AdvanceToken - Advances the PTHLexer to the next token.
1107415326dcbba6f333f5f7708ac1bf4982f3adb5aTed Kremenek  void AdvanceToken() { NeedsFetching = true; }
111cd4e2aecde5bb7810715d5d5a88ac63ce7946f34Ted Kremenek
112cd4e2aecde5bb7810715d5d5a88ac63ce7946f34Ted Kremenek  bool LexEndOfFile(Token &Result);
113274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek};
114274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
115274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek}  // end namespace clang
116274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
117274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek#endif
118