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 "compiler/preprocessor/SourceLocation.h"
14
15namespace angle
16{
17
18namespace pp
19{
20
21struct Token
22{
23 enum Type
24 {
25 // Calling this ERROR causes a conflict with wingdi.h
26 GOT_ERROR = -1,
27 LAST = 0, // EOF.
28
29 IDENTIFIER = 258,
30
31 CONST_INT,
32 CONST_FLOAT,
33
34 OP_INC,
35 OP_DEC,
36 OP_LEFT,
37 OP_RIGHT,
38 OP_LE,
39 OP_GE,
40 OP_EQ,
41 OP_NE,
42 OP_AND,
43 OP_XOR,
44 OP_OR,
45 OP_ADD_ASSIGN,
46 OP_SUB_ASSIGN,
47 OP_MUL_ASSIGN,
48 OP_DIV_ASSIGN,
49 OP_MOD_ASSIGN,
50 OP_LEFT_ASSIGN,
51 OP_RIGHT_ASSIGN,
52 OP_AND_ASSIGN,
53 OP_XOR_ASSIGN,
54 OP_OR_ASSIGN,
55
56 // Preprocessing token types.
57 // These types are used by the preprocessor internally.
58 // Preprocessor clients must not depend or check for them.
59 PP_HASH,
60 PP_NUMBER,
61 PP_OTHER
62 };
63 enum Flags
64 {
65 AT_START_OF_LINE = 1 << 0,
66 HAS_LEADING_SPACE = 1 << 1,
67 EXPANSION_DISABLED = 1 << 2
68 };
69
70 Token() : type(0), flags(0) {}
71
72 void reset();
73 bool equals(const Token &other) const;
74
75 // Returns true if this is the first token on line.
76 // It disregards any leading whitespace.
77 bool atStartOfLine() const { return (flags & AT_START_OF_LINE) != 0; }
78 void setAtStartOfLine(bool start);
79
80 bool hasLeadingSpace() const { return (flags & HAS_LEADING_SPACE) != 0; }
81 void setHasLeadingSpace(bool space);
82
83 bool expansionDisabled() const { return (flags & EXPANSION_DISABLED) != 0; }
84 void setExpansionDisabled(bool disable);
85
86 // Converts text into numeric value for CONST_INT and CONST_FLOAT token.
87 // Returns false if the parsed value cannot fit into an int or float.
88 bool iValue(int *value) const;
89 bool uValue(unsigned int *value) const;
90
91 int type;
92 unsigned int flags;
93 SourceLocation location;
94 std::string text;
95};
96
97inline bool operator==(const Token &lhs, const Token &rhs)
98{
99 return lhs.equals(rhs);
100}
101
102inline bool operator!=(const Token &lhs, const Token &rhs)
103{
104 return !lhs.equals(rhs);
105}
106
107std::ostream &operator<<(std::ostream &out, const Token &token);
108
109constexpr char kDefined[] = "defined";
110
111} // namespace pp
112
113} // namespace angle
114
115#endif // COMPILER_PREPROCESSOR_TOKEN_H_
116