1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2011 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker #ifndef COMPILER_PREPROCESSOR_TOKEN_H_ 8*8975f5c5SAndroid Build Coastguard Worker #define COMPILER_PREPROCESSOR_TOKEN_H_ 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #include <ostream> 11*8975f5c5SAndroid Build Coastguard Worker #include <string> 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/SourceLocation.h" 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker namespace angle 16*8975f5c5SAndroid Build Coastguard Worker { 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker namespace pp 19*8975f5c5SAndroid Build Coastguard Worker { 20*8975f5c5SAndroid Build Coastguard Worker 21*8975f5c5SAndroid Build Coastguard Worker struct Token 22*8975f5c5SAndroid Build Coastguard Worker { 23*8975f5c5SAndroid Build Coastguard Worker enum Type 24*8975f5c5SAndroid Build Coastguard Worker { 25*8975f5c5SAndroid Build Coastguard Worker // Calling this ERROR causes a conflict with wingdi.h 26*8975f5c5SAndroid Build Coastguard Worker GOT_ERROR = -1, 27*8975f5c5SAndroid Build Coastguard Worker LAST = 0, // EOF. 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker IDENTIFIER = 258, 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker CONST_INT, 32*8975f5c5SAndroid Build Coastguard Worker CONST_FLOAT, 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker OP_INC, 35*8975f5c5SAndroid Build Coastguard Worker OP_DEC, 36*8975f5c5SAndroid Build Coastguard Worker OP_LEFT, 37*8975f5c5SAndroid Build Coastguard Worker OP_RIGHT, 38*8975f5c5SAndroid Build Coastguard Worker OP_LE, 39*8975f5c5SAndroid Build Coastguard Worker OP_GE, 40*8975f5c5SAndroid Build Coastguard Worker OP_EQ, 41*8975f5c5SAndroid Build Coastguard Worker OP_NE, 42*8975f5c5SAndroid Build Coastguard Worker OP_AND, 43*8975f5c5SAndroid Build Coastguard Worker OP_XOR, 44*8975f5c5SAndroid Build Coastguard Worker OP_OR, 45*8975f5c5SAndroid Build Coastguard Worker OP_ADD_ASSIGN, 46*8975f5c5SAndroid Build Coastguard Worker OP_SUB_ASSIGN, 47*8975f5c5SAndroid Build Coastguard Worker OP_MUL_ASSIGN, 48*8975f5c5SAndroid Build Coastguard Worker OP_DIV_ASSIGN, 49*8975f5c5SAndroid Build Coastguard Worker OP_MOD_ASSIGN, 50*8975f5c5SAndroid Build Coastguard Worker OP_LEFT_ASSIGN, 51*8975f5c5SAndroid Build Coastguard Worker OP_RIGHT_ASSIGN, 52*8975f5c5SAndroid Build Coastguard Worker OP_AND_ASSIGN, 53*8975f5c5SAndroid Build Coastguard Worker OP_XOR_ASSIGN, 54*8975f5c5SAndroid Build Coastguard Worker OP_OR_ASSIGN, 55*8975f5c5SAndroid Build Coastguard Worker 56*8975f5c5SAndroid Build Coastguard Worker // Preprocessing token types. 57*8975f5c5SAndroid Build Coastguard Worker // These types are used by the preprocessor internally. 58*8975f5c5SAndroid Build Coastguard Worker // Preprocessor clients must not depend or check for them. 59*8975f5c5SAndroid Build Coastguard Worker PP_HASH, 60*8975f5c5SAndroid Build Coastguard Worker PP_NUMBER, 61*8975f5c5SAndroid Build Coastguard Worker PP_OTHER 62*8975f5c5SAndroid Build Coastguard Worker }; 63*8975f5c5SAndroid Build Coastguard Worker enum Flags 64*8975f5c5SAndroid Build Coastguard Worker { 65*8975f5c5SAndroid Build Coastguard Worker AT_START_OF_LINE = 1 << 0, 66*8975f5c5SAndroid Build Coastguard Worker HAS_LEADING_SPACE = 1 << 1, 67*8975f5c5SAndroid Build Coastguard Worker EXPANSION_DISABLED = 1 << 2 68*8975f5c5SAndroid Build Coastguard Worker }; 69*8975f5c5SAndroid Build Coastguard Worker TokenToken70*8975f5c5SAndroid Build Coastguard Worker Token() : type(0), flags(0) {} 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Worker void reset(); 73*8975f5c5SAndroid Build Coastguard Worker bool equals(const Token &other) const; 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker // Returns true if this is the first token on line. 76*8975f5c5SAndroid Build Coastguard Worker // It disregards any leading whitespace. atStartOfLineToken77*8975f5c5SAndroid Build Coastguard Worker bool atStartOfLine() const { return (flags & AT_START_OF_LINE) != 0; } 78*8975f5c5SAndroid Build Coastguard Worker void setAtStartOfLine(bool start); 79*8975f5c5SAndroid Build Coastguard Worker hasLeadingSpaceToken80*8975f5c5SAndroid Build Coastguard Worker bool hasLeadingSpace() const { return (flags & HAS_LEADING_SPACE) != 0; } 81*8975f5c5SAndroid Build Coastguard Worker void setHasLeadingSpace(bool space); 82*8975f5c5SAndroid Build Coastguard Worker expansionDisabledToken83*8975f5c5SAndroid Build Coastguard Worker bool expansionDisabled() const { return (flags & EXPANSION_DISABLED) != 0; } 84*8975f5c5SAndroid Build Coastguard Worker void setExpansionDisabled(bool disable); 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker // Converts text into numeric value for CONST_INT and CONST_FLOAT token. 87*8975f5c5SAndroid Build Coastguard Worker // Returns false if the parsed value cannot fit into an int or float. 88*8975f5c5SAndroid Build Coastguard Worker bool iValue(int *value) const; 89*8975f5c5SAndroid Build Coastguard Worker bool uValue(unsigned int *value) const; 90*8975f5c5SAndroid Build Coastguard Worker 91*8975f5c5SAndroid Build Coastguard Worker int type; 92*8975f5c5SAndroid Build Coastguard Worker unsigned int flags; 93*8975f5c5SAndroid Build Coastguard Worker SourceLocation location; 94*8975f5c5SAndroid Build Coastguard Worker std::string text; 95*8975f5c5SAndroid Build Coastguard Worker }; 96*8975f5c5SAndroid Build Coastguard Worker 97*8975f5c5SAndroid Build Coastguard Worker inline bool operator==(const Token &lhs, const Token &rhs) 98*8975f5c5SAndroid Build Coastguard Worker { 99*8975f5c5SAndroid Build Coastguard Worker return lhs.equals(rhs); 100*8975f5c5SAndroid Build Coastguard Worker } 101*8975f5c5SAndroid Build Coastguard Worker 102*8975f5c5SAndroid Build Coastguard Worker inline bool operator!=(const Token &lhs, const Token &rhs) 103*8975f5c5SAndroid Build Coastguard Worker { 104*8975f5c5SAndroid Build Coastguard Worker return !lhs.equals(rhs); 105*8975f5c5SAndroid Build Coastguard Worker } 106*8975f5c5SAndroid Build Coastguard Worker 107*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &out, const Token &token); 108*8975f5c5SAndroid Build Coastguard Worker 109*8975f5c5SAndroid Build Coastguard Worker constexpr char kDefined[] = "defined"; 110*8975f5c5SAndroid Build Coastguard Worker 111*8975f5c5SAndroid Build Coastguard Worker } // namespace pp 112*8975f5c5SAndroid Build Coastguard Worker 113*8975f5c5SAndroid Build Coastguard Worker } // namespace angle 114*8975f5c5SAndroid Build Coastguard Worker 115*8975f5c5SAndroid Build Coastguard Worker #endif // COMPILER_PREPROCESSOR_TOKEN_H_ 116