|  | // Copyright 2016 The SwiftShader Authors. All Rights Reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //    http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | #ifndef COMPILER_PREPROCESSOR_TOKEN_H_ | 
|  | #define COMPILER_PREPROCESSOR_TOKEN_H_ | 
|  |  | 
|  | #include <ostream> | 
|  | #include <string> | 
|  |  | 
|  | #include "SourceLocation.h" | 
|  |  | 
|  | namespace pp | 
|  | { | 
|  |  | 
|  | struct Token | 
|  | { | 
|  | enum Type | 
|  | { | 
|  | // Calling this ERROR causes a conflict with wingdi.h | 
|  | GOT_ERROR = -1, | 
|  | 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); | 
|  | } | 
|  |  | 
|  | std::ostream &operator<<(std::ostream &out, const Token &token); | 
|  |  | 
|  | }  // namepsace pp | 
|  | #endif  // COMPILER_PREPROCESSOR_TOKEN_H_ |