Home | History | Annotate | Download | only in preprocessor
      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 
     15 namespace pp
     16 {
     17 
     18 struct 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 
    106 inline bool operator==(const Token &lhs, const Token &rhs)
    107 {
    108     return lhs.equals(rhs);
    109 }
    110 
    111 inline bool operator!=(const Token &lhs, const Token &rhs)
    112 {
    113     return !lhs.equals(rhs);
    114 }
    115 
    116 extern std::ostream &operator<<(std::ostream &out, const Token &token);
    117 
    118 }  // namepsace pp
    119 #endif  // COMPILER_PREPROCESSOR_TOKEN_H_
    120