зеркало из https://github.com/microsoft/clang-1.git
- Default initialize ParsingPreprocessorDirective, ParsingFilename, and
LexingRawMode in the ctor of PreprocessorLexer. - PTHLexer: Use "LastToken" instead of "NumToken" git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59690 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
4d35da2e41
Коммит
452e37837a
|
@ -11,29 +11,24 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_PTHLexer_H
|
||||
#define LLVM_CLANG_PTHLexer_H
|
||||
#ifndef LLVM_CLANG_PTHLEXER_H
|
||||
#define LLVM_CLANG_PTHLEXER_H
|
||||
|
||||
#include "clang/Lex/PreprocessorLexer.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
class PTHLexer : public PreprocessorLexer {
|
||||
/// FileLoc - Location for the start of the file.
|
||||
///
|
||||
SourceLocation FileLoc;
|
||||
|
||||
/// Tokens - This is the pointer to an array of tokens that the macro is
|
||||
/// defined to, with arguments expanded for function-like macros. If this is
|
||||
/// a token stream, these are the tokens we are returning.
|
||||
const Token *Tokens;
|
||||
|
||||
/// NumTokens - This is the length of the Tokens array.
|
||||
///
|
||||
unsigned NumTokens;
|
||||
/// LastTokenIdx - The index of the last token in Tokens. This token
|
||||
/// will be an eof token.
|
||||
unsigned LastToken;
|
||||
|
||||
/// CurToken - This is the next token that Lex will return.
|
||||
///
|
||||
/// CurToken - This is the index of the next token that Lex will return.
|
||||
unsigned CurToken;
|
||||
|
||||
PTHLexer(const PTHLexer&); // DO NOT IMPLEMENT
|
||||
|
@ -51,12 +46,6 @@ public:
|
|||
|
||||
void setEOF(Token &Tok);
|
||||
|
||||
/// getFileLoc - Return the File Location for the file we are lexing out of.
|
||||
/// The physical location encodes the location where the characters come from,
|
||||
/// the virtual location encodes where we should *claim* the characters came
|
||||
/// from. Currently this is only used by _Pragma handling.
|
||||
SourceLocation getFileLoc() const { return FileLoc; }
|
||||
|
||||
/// DiscardToEndOfLine - Read the rest of the current preprocessor line as an
|
||||
/// uninterpreted string. This switches the lexer out of directive mode.
|
||||
void DiscardToEndOfLine();
|
||||
|
|
|
@ -68,7 +68,12 @@ protected:
|
|||
friend class Preprocessor;
|
||||
|
||||
PreprocessorLexer(Preprocessor* pp, SourceLocation L);
|
||||
PreprocessorLexer() : PP(0), FileID(0) {}
|
||||
|
||||
PreprocessorLexer()
|
||||
: PP(0), FileID(0),
|
||||
ParsingPreprocessorDirective(false),
|
||||
ParsingFilename(false),
|
||||
LexingRawMode(false) {}
|
||||
|
||||
virtual ~PreprocessorLexer();
|
||||
|
||||
|
|
|
@ -17,21 +17,19 @@
|
|||
using namespace clang;
|
||||
|
||||
PTHLexer::PTHLexer(Preprocessor& pp, SourceLocation fileloc,
|
||||
const Token *TokArray, unsigned NumToks)
|
||||
: PreprocessorLexer(&pp, fileloc), FileLoc(fileloc),
|
||||
Tokens(TokArray), NumTokens(NumToks), CurToken(0) {
|
||||
const Token *TokArray, unsigned NumTokens)
|
||||
: PreprocessorLexer(&pp, fileloc),
|
||||
Tokens(TokArray),
|
||||
LastToken(NumTokens - 1),
|
||||
CurToken(0) {
|
||||
|
||||
assert (Tokens[NumTokens-1].is(tok::eof));
|
||||
--NumTokens;
|
||||
|
||||
LexingRawMode = false;
|
||||
ParsingPreprocessorDirective = false;
|
||||
ParsingFilename = false;
|
||||
assert (NumTokens >= 1);
|
||||
assert (Tokens[LastToken].is(tok::eof));
|
||||
}
|
||||
|
||||
void PTHLexer::Lex(Token& Tok) {
|
||||
|
||||
if (CurToken == NumTokens) {
|
||||
if (CurToken == LastToken) {
|
||||
// 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.
|
||||
|
@ -73,8 +71,7 @@ void PTHLexer::Lex(Token& Tok) {
|
|||
}
|
||||
|
||||
void PTHLexer::setEOF(Token& Tok) {
|
||||
Tok = Tokens[NumTokens]; // NumTokens is already adjusted, so this isn't
|
||||
// an overflow.
|
||||
Tok = Tokens[LastToken];
|
||||
}
|
||||
|
||||
void PTHLexer::DiscardToEndOfLine() {
|
||||
|
@ -82,17 +79,17 @@ void PTHLexer::DiscardToEndOfLine() {
|
|||
"Must be in a preprocessing directive!");
|
||||
|
||||
// Already at end-of-file?
|
||||
if (CurToken == NumTokens)
|
||||
if (CurToken == LastToken)
|
||||
return;
|
||||
|
||||
// Find the first token that is not the start of the *current* line.
|
||||
for ( ++CurToken; CurToken != NumTokens ; ++CurToken )
|
||||
for ( ++CurToken; CurToken != LastToken ; ++CurToken )
|
||||
if (Tokens[CurToken].isAtStartOfLine())
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned PTHLexer::isNextPPTokenLParen() {
|
||||
if (CurToken == NumTokens)
|
||||
if (CurToken == LastToken)
|
||||
return 2;
|
||||
|
||||
return Tokens[CurToken].is(tok::l_paren);
|
||||
|
|
|
@ -19,7 +19,10 @@
|
|||
using namespace clang;
|
||||
|
||||
PreprocessorLexer::PreprocessorLexer(Preprocessor* pp, SourceLocation L)
|
||||
: PP(pp), FileID(pp->getSourceManager().getPhysicalLoc(L).getFileID()) {}
|
||||
: PP(pp), FileID(pp->getSourceManager().getPhysicalLoc(L).getFileID()),
|
||||
ParsingPreprocessorDirective(false),
|
||||
ParsingFilename(false),
|
||||
LexingRawMode(false) {}
|
||||
|
||||
PreprocessorLexer::~PreprocessorLexer() {}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче