1// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef COMPILER_PREPROCESSOR_TOKEN_H_
16#define COMPILER_PREPROCESSOR_TOKEN_H_
17
18#include <ostream>
19#include <string>
20
21#include "SourceLocation.h"
22
23namespace pp
24{
25
26struct Token
27{
28 enum Type
29 {
30 // Calling this ERROR causes a conflict with wingdi.h
31 GOT_ERROR = -1,
32 LAST = 0, // EOF.
33
34 IDENTIFIER = 258,
35
36 CONST_INT,
37 CONST_FLOAT,
38
39 OP_INC,
40 OP_DEC,
41 OP_LEFT,
42 OP_RIGHT,
43 OP_LE,
44 OP_GE,
45 OP_EQ,
46 OP_NE,
47 OP_AND,
48 OP_XOR,
49 OP_OR,
50 OP_ADD_ASSIGN,
51 OP_SUB_ASSIGN,
52 OP_MUL_ASSIGN,
53 OP_DIV_ASSIGN,
54 OP_MOD_ASSIGN,
55 OP_LEFT_ASSIGN,
56 OP_RIGHT_ASSIGN,
57 OP_AND_ASSIGN,
58 OP_XOR_ASSIGN,
59 OP_OR_ASSIGN,
60
61 // Preprocessing token types.
62 // These types are used by the preprocessor internally.
63 // Preprocessor clients must not depend or check for them.
64 PP_HASH,
65 PP_NUMBER,
66 PP_OTHER
67 };
68 enum Flags
69 {
70 AT_START_OF_LINE = 1 << 0,
71 HAS_LEADING_SPACE = 1 << 1,
72 EXPANSION_DISABLED = 1 << 2
73 };
74
75 Token() : type(0), flags(0) {}
76
77 void reset();
78 bool equals(const Token &other) const;
79
80 // Returns true if this is the first token on line.
81 // It disregards any leading whitespace.
82 bool atStartOfLine() const { return (flags & AT_START_OF_LINE) != 0; }
83 void setAtStartOfLine(bool start);
84
85 bool hasLeadingSpace() const { return (flags & HAS_LEADING_SPACE) != 0; }
86 void setHasLeadingSpace(bool space);
87
88 bool expansionDisabled() const { return (flags & EXPANSION_DISABLED) != 0; }
89 void setExpansionDisabled(bool disable);
90
91 // Converts text into numeric value for CONST_INT and CONST_FLOAT token.
92 // Returns false if the parsed value cannot fit into an int or float.
93 bool iValue(int *value) const;
94 bool uValue(unsigned int *value) const;
95 bool fValue(float *value) const;
96
97 int type;
98 unsigned int flags;
99 SourceLocation location;
100 std::string text;
101};
102
103inline bool operator==(const Token &lhs, const Token &rhs)
104{
105 return lhs.equals(rhs);
106}
107
108inline bool operator!=(const Token &lhs, const Token &rhs)
109{
110 return !lhs.equals(rhs);
111}
112
113std::ostream &operator<<(std::ostream &out, const Token &token);
114
115} // namepsace pp
116#endif // COMPILER_PREPROCESSOR_TOKEN_H_
117