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