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() : type(0), flags(0) { }
     66 
     67     void reset();
     68     bool equals(const Token& other) const;
     69 
     70     // Returns true if this is the first token on line.
     71     // It disregards any leading whitespace.
     72     bool atStartOfLine() const { return (flags & AT_START_OF_LINE) != 0; }
     73     void setAtStartOfLine(bool start);
     74 
     75     bool hasLeadingSpace() const { return (flags & HAS_LEADING_SPACE) != 0; }
     76     void setHasLeadingSpace(bool space);
     77 
     78     bool expansionDisabled() const { return (flags & EXPANSION_DISABLED) != 0; }
     79     void setExpansionDisabled(bool disable);
     80 
     81     // Converts text into numeric value for CONST_INT and CONST_FLOAT token.
     82     // Returns false if the parsed value cannot fit into an int or float.
     83     bool iValue(int* value) const;
     84     bool uValue(unsigned int* value) const;
     85     bool fValue(float* value) const;
     86 
     87     int type;
     88     unsigned int flags;
     89     SourceLocation location;
     90     std::string text;
     91 };
     92 
     93 inline bool operator==(const Token& lhs, const Token& rhs)
     94 {
     95     return lhs.equals(rhs);
     96 }
     97 
     98 inline bool operator!=(const Token& lhs, const Token& rhs)
     99 {
    100     return !lhs.equals(rhs);
    101 }
    102 
    103 extern std::ostream& operator<<(std::ostream& out, const Token& token);
    104 
    105 }  // namepsace pp
    106 #endif  // COMPILER_PREPROCESSOR_TOKEN_H_
    107