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