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