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