diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-11-12 21:37:15 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-11-12 21:37:15 +0000 |
commit | 274b20863a728cc6a31ee75c670e3733600c1531 (patch) | |
tree | 1891ddcc437de3876a8f0f171fcc8acbd6546427 /lib/Lex/PTHLexer.cpp | |
parent | 0e977de1eacfbc143bdedad87c14b53814159023 (diff) |
Add skeleton for PTH lexer.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59169 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/PTHLexer.cpp')
-rw-r--r-- | lib/Lex/PTHLexer.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp new file mode 100644 index 0000000000..e1b392068c --- /dev/null +++ b/lib/Lex/PTHLexer.cpp @@ -0,0 +1,79 @@ +//===--- PTHLexer.cpp - Lex from a token stream ---------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the PTHLexer interface. +// +//===----------------------------------------------------------------------===// + +#include "clang/Lex/PTHLexer.h" +#include "clang/Lex/Preprocessor.h" +#include "clang/Lex/Token.h" +#include "clang/Basic/TokenKinds.h" + +using namespace clang; + +PTHLexer::PTHLexer(Preprocessor& pp, SourceLocation fileloc, + const Token *TokArray, unsigned NumToks) + : PP(pp), FileLoc(fileloc), Tokens(TokArray), NumTokens(NumToks), CurToken(0){ + + assert (Tokens[NumTokens-1].is(tok::eof)); + --NumTokens; + + LexingRawMode = false; + ParsingPreprocessorDirective = false; + ParsingFilename = false; +} + +void PTHLexer::Lex(Token& Tok) { + + if (CurToken == NumTokens) { + // If we hit the end of the file while parsing a preprocessor directive, + // end the preprocessor directive first. The next token returned will + // then be the end of file. + // OR + // If we are in raw mode, return this event as an EOF token. Let the caller + // that put us in raw mode handle the event. + if (ParsingPreprocessorDirective || LexingRawMode) { + // Done parsing the "line". + ParsingPreprocessorDirective = false; + Tok = Tokens[CurToken]; // not an out-of-bound access + // FIXME: eom handling? + } + else + PP.HandleEndOfFile(Tok, false); + + return; + } + + Tok = Tokens[CurToken]; + + if (ParsingPreprocessorDirective && Tok.isAtStartOfLine()) { + ParsingPreprocessorDirective = false; // Done parsing the "line". + MIOpt.ReadToken(); + // FIXME: Need to replicate: + // FormTokenWithChars(Tok, CurPtr, tok::eom); + Tok.setKind(tok::eom); + return; + } + else // Otherwise, advance to the next token. + ++CurToken; + + if (Tok.isAtStartOfLine() && Tok.is(tok::hash) && !LexingRawMode) { + PP.HandleDirective(Tok); + PP.Lex(Tok); + return; + } + + MIOpt.ReadToken(); +} + +void PTHLexer::setEOF(Token& Tok) { + Tok = Tokens[NumTokens]; // NumTokens is already adjusted, so this isn't + // an overflow. +} |