10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 20bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License. 50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at 60bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 80bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software 100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and 130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License. 140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#ifndef COMPILER_PREPROCESSOR_TOKEN_H_ 160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#define COMPILER_PREPROCESSOR_TOKEN_H_ 170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <ostream> 190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <string> 200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "SourceLocation.h" 220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensnamespace pp 240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensstruct Token 270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens enum Type 290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 30e13238e0acd3f22252c90bee6a7684961eefe5daAlexis Hetu // Calling this ERROR causes a conflict with wingdi.h 31e13238e0acd3f22252c90bee6a7684961eefe5daAlexis Hetu GOT_ERROR = -1, 320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens LAST = 0, // EOF. 330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens IDENTIFIER = 258, 350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens CONST_INT, 370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens CONST_FLOAT, 380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_INC, 400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_DEC, 410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_LEFT, 420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_RIGHT, 430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_LE, 440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_GE, 450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_EQ, 460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_NE, 470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_AND, 480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_XOR, 490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_OR, 500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_ADD_ASSIGN, 510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_SUB_ASSIGN, 520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_MUL_ASSIGN, 530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_DIV_ASSIGN, 540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_MOD_ASSIGN, 550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_LEFT_ASSIGN, 560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_RIGHT_ASSIGN, 570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_AND_ASSIGN, 580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_XOR_ASSIGN, 590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens OP_OR_ASSIGN, 600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Preprocessing token types. 620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // These types are used by the preprocessor internally. 630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Preprocessor clients must not depend or check for them. 640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens PP_HASH, 650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens PP_NUMBER, 660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens PP_OTHER 670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens enum Flags 690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens AT_START_OF_LINE = 1 << 0, 710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens HAS_LEADING_SPACE = 1 << 1, 720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens EXPANSION_DISABLED = 1 << 2 730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 75e13238e0acd3f22252c90bee6a7684961eefe5daAlexis Hetu Token() : type(0), flags(0) {} 760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void reset(); 78e13238e0acd3f22252c90bee6a7684961eefe5daAlexis Hetu bool equals(const Token &other) const; 790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Returns true if this is the first token on line. 810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // It disregards any leading whitespace. 820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool atStartOfLine() const { return (flags & AT_START_OF_LINE) != 0; } 830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void setAtStartOfLine(bool start); 840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool hasLeadingSpace() const { return (flags & HAS_LEADING_SPACE) != 0; } 860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void setHasLeadingSpace(bool space); 870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool expansionDisabled() const { return (flags & EXPANSION_DISABLED) != 0; } 890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void setExpansionDisabled(bool disable); 900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Converts text into numeric value for CONST_INT and CONST_FLOAT token. 920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens // Returns false if the parsed value cannot fit into an int or float. 93e13238e0acd3f22252c90bee6a7684961eefe5daAlexis Hetu bool iValue(int *value) const; 94e13238e0acd3f22252c90bee6a7684961eefe5daAlexis Hetu bool uValue(unsigned int *value) const; 95e13238e0acd3f22252c90bee6a7684961eefe5daAlexis Hetu bool fValue(float *value) const; 960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int type; 980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int flags; 990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens SourceLocation location; 1000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens std::string text; 1010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens}; 1020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 103e13238e0acd3f22252c90bee6a7684961eefe5daAlexis Hetuinline bool operator==(const Token &lhs, const Token &rhs) 1040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 1050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return lhs.equals(rhs); 1060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 1070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 108e13238e0acd3f22252c90bee6a7684961eefe5daAlexis Hetuinline bool operator!=(const Token &lhs, const Token &rhs) 1090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 1100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return !lhs.equals(rhs); 1110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 1120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 113e13238e0acd3f22252c90bee6a7684961eefe5daAlexis Hetustd::ostream &operator<<(std::ostream &out, const Token &token); 1140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 1150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} // namepsace pp 1160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#endif // COMPILER_PREPROCESSOR_TOKEN_H_ 117