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