PTHLexer.cpp revision 2f1c0243f7fc5d12446efcb006c071854c345923
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//===--- PTHLexer.cpp - Lex from a token stream ---------------------------===//
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                     The LLVM Compiler Infrastructure
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// This file is distributed under the University of Illinois Open Source
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// License. See LICENSE.TXT for details.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//===----------------------------------------------------------------------===//
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// This file implements the PTHLexer interface.
1106f96e2652e4855b6520ad9dd70583677605b79aRomain Guy//
12a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy//===----------------------------------------------------------------------===//
1306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
1406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include "clang/Lex/PTHLexer.h"
1506f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include "clang/Lex/Preprocessor.h"
167fac2e18339f765320d759e8d4c090f92431959eRomain Guy#include "clang/Basic/TokenKinds.h"
177fac2e18339f765320d759e8d4c090f92431959eRomain Guyusing namespace clang;
1806f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
1906f96e2652e4855b6520ad9dd70583677605b79aRomain GuyPTHLexer::PTHLexer(Preprocessor& pp, SourceLocation fileloc,
207fac2e18339f765320d759e8d4c090f92431959eRomain Guy                   const Token *TokArray, unsigned NumToks)
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  : PreprocessorLexer(&pp, fileloc), FileLoc(fileloc),
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Tokens(TokArray), NumTokens(NumToks), CurToken(0) {
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  assert (Tokens[NumTokens-1].is(tok::eof));
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  --NumTokens;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat  LexingRawMode = false;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  ParsingPreprocessorDirective = false;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  ParsingFilename = false;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid PTHLexer::Lex(Token& Tok) {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  if (CurToken == NumTokens) {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If we hit the end of the file while parsing a preprocessor directive,
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // end the preprocessor directive first.  The next token returned will
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // then be the end of file.
384cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes    //   OR
3936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    // If we are in raw mode, return this event as an EOF token.  Let the caller
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // that put us in raw mode handle the event.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ParsingPreprocessorDirective || LexingRawMode) {
422e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III      // Done parsing the "line".
432e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III      ParsingPreprocessorDirective = false;
442e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III      Tok = Tokens[CurToken]; // not an out-of-bound access
452e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III      // FIXME: eom handling?
462e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III    }
474cb1753ec6e90d7e747880c599dc1c164a568cf3Elliott Hughes    else
4836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat      PP->HandleEndOfFile(Tok, false);
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53866cf65cc3c53f67836c9157d5c661adfdbd25e1Leon Scroggins III  Tok = Tokens[CurToken];
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat  if (ParsingPreprocessorDirective && Tok.isAtStartOfLine()) {
566062c5912dc79704b489fc8c289b78a400ed05eeDerek Sollenberger    ParsingPreprocessorDirective = false; // Done parsing the "line".
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    MIOpt.ReadToken();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // FIXME:  Need to replicate:
5901edef10b9724fa5607d7918addc31a3b0c991dcJohn Reck    // FormTokenWithChars(Tok, CurPtr, tok::eom);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Tok.setKind(tok::eom);
6136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return;
6236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat  }
63a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed  else // Otherwise, advance to the next token.
6401edef10b9724fa5607d7918addc31a3b0c991dcJohn Reck    ++CurToken;
6501edef10b9724fa5607d7918addc31a3b0c991dcJohn Reck
6601edef10b9724fa5607d7918addc31a3b0c991dcJohn Reck  if (Tok.isAtStartOfLine() && Tok.is(tok::hash) && !LexingRawMode) {
6701edef10b9724fa5607d7918addc31a3b0c991dcJohn Reck    PP->HandleDirective(Tok);
68a04e555dc91b11ad833cb5db4a24e38082d1dc45Mike Reed    PP->Lex(Tok);
69c1469f39b571f5660346fc837ac30b19d7651a43John Reck    return;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  MIOpt.ReadToken();
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatvoid PTHLexer::setEOF(Token& Tok) {
7636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat  Tok = Tokens[NumTokens]; // NumTokens is already adjusted, so this isn't
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                           // an overflow.
7836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat}
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid PTHLexer::DiscardToEndOfLine() {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  assert(ParsingPreprocessorDirective && ParsingFilename == false &&
8206f96e2652e4855b6520ad9dd70583677605b79aRomain Guy         "Must be in a preprocessing directive!");
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  assert (0 && "Not implemented.");
8436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat}
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectunsigned PTHLexer::isNextPPTokenLParen() {
8706f96e2652e4855b6520ad9dd70583677605b79aRomain Guy  assert (0 && "Not implemented.");
887fac2e18339f765320d759e8d4c090f92431959eRomain Guy  return 0;
8936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat}
9036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
9136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat