// | |
// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style license that can be | |
// found in the LICENSE file. | |
// | |
#ifndef COMPILER_PREPROCESSOR_TOKEN_H_ | |
#define COMPILER_PREPROCESSOR_TOKEN_H_ | |
#include <ostream> | |
#include <string> | |
#include "SourceLocation.h" | |
namespace pp | |
{ | |
struct Token | |
{ | |
enum Type | |
{ | |
LAST = 0, // EOF. | |
IDENTIFIER = 258, | |
CONST_INT, | |
CONST_FLOAT, | |
OP_INC, | |
OP_DEC, | |
OP_LEFT, | |
OP_RIGHT, | |
OP_LE, | |
OP_GE, | |
OP_EQ, | |
OP_NE, | |
OP_AND, | |
OP_XOR, | |
OP_OR, | |
OP_ADD_ASSIGN, | |
OP_SUB_ASSIGN, | |
OP_MUL_ASSIGN, | |
OP_DIV_ASSIGN, | |
OP_MOD_ASSIGN, | |
OP_LEFT_ASSIGN, | |
OP_RIGHT_ASSIGN, | |
OP_AND_ASSIGN, | |
OP_XOR_ASSIGN, | |
OP_OR_ASSIGN, | |
// Preprocessing token types. | |
// These types are used by the preprocessor internally. | |
// Preprocessor clients must not depend or check for them. | |
PP_HASH, | |
PP_NUMBER, | |
PP_OTHER | |
}; | |
enum Flags | |
{ | |
AT_START_OF_LINE = 1 << 0, | |
HAS_LEADING_SPACE = 1 << 1, | |
EXPANSION_DISABLED = 1 << 2 | |
}; | |
Token() : type(0), flags(0) { } | |
void reset(); | |
bool equals(const Token& other) const; | |
// Returns true if this is the first token on line. | |
// It disregards any leading whitespace. | |
bool atStartOfLine() const { return (flags & AT_START_OF_LINE) != 0; } | |
void setAtStartOfLine(bool start); | |
bool hasLeadingSpace() const { return (flags & HAS_LEADING_SPACE) != 0; } | |
void setHasLeadingSpace(bool space); | |
bool expansionDisabled() const { return (flags & EXPANSION_DISABLED) != 0; } | |
void setExpansionDisabled(bool disable); | |
// Converts text into numeric value for CONST_INT and CONST_FLOAT token. | |
// Returns false if the parsed value cannot fit into an int or float. | |
bool iValue(int* value) const; | |
bool uValue(unsigned int* value) const; | |
bool fValue(float* value) const; | |
int type; | |
unsigned int flags; | |
SourceLocation location; | |
std::string text; | |
}; | |
inline bool operator==(const Token& lhs, const Token& rhs) | |
{ | |
return lhs.equals(rhs); | |
} | |
inline bool operator!=(const Token& lhs, const Token& rhs) | |
{ | |
return !lhs.equals(rhs); | |
} | |
extern std::ostream& operator<<(std::ostream& out, const Token& token); | |
} // namepsace pp | |
#endif // COMPILER_PREPROCESSOR_TOKEN_H_ |