Home | History | Annotate | Line # | Download | only in dmd
      1 
      2 /* Compiler implementation of the D programming language
      3  * Copyright (C) 1999-2022 by The D Language Foundation, All Rights Reserved
      4  * written by Walter Bright
      5  * https://www.digitalmars.com
      6  * Distributed under the Boost Software License, Version 1.0.
      7  * https://www.boost.org/LICENSE_1_0.txt
      8  * https://github.com/dlang/dmd/blob/master/src/dmd/tokens.h
      9  */
     10 
     11 #pragma once
     12 
     13 #include "root/dcompat.h"
     14 #include "root/port.h"
     15 #include "globals.h"
     16 
     17 class Identifier;
     18 
     19 /* Tokens:
     20         (       )
     21         [       ]
     22         {       }
     23         <       >       <=      >=      ==      !=      ===     !==
     24         <<      >>      <<=     >>=     >>>     >>>=
     25         +       -       +=      -=
     26         *       /       %       *=      /=      %=
     27         &       |       ^       &=      |=      ^=
     28         =       !       ~       @
     29         ^^      ^^=
     30         ++      --
     31         .       ->      :       ,       =>
     32         ?       &&      ||
     33  */
     34 
     35 enum class TOK : unsigned char
     36 {
     37     reserved,
     38 
     39     // Other
     40     leftParenthesis,
     41     rightParenthesis,
     42     leftBracket,
     43     rightBracket,
     44     leftCurly,
     45     rightCurly,
     46     colon,
     47     semicolon,
     48     dotDotDot,
     49     endOfFile,
     50     cast_,
     51     null_,
     52     assert_,
     53     true_,
     54     false_,
     55     throw_,
     56     new_,
     57     delete_,
     58     variable,
     59     slice,
     60     version_,
     61     module_,
     62     dollar,
     63     template_,
     64     typeof_,
     65     pragma_,
     66     typeid_,
     67     comment,
     68 
     69     // Operators
     70     lessThan,
     71     greaterThan,
     72     lessOrEqual,
     73     greaterOrEqual,
     74     equal,
     75     notEqual,
     76     identity,
     77     notIdentity,
     78     is_,
     79 
     80     leftShift,
     81     rightShift,
     82     leftShiftAssign,
     83     rightShiftAssign,
     84     unsignedRightShift,
     85     unsignedRightShiftAssign,
     86     concatenateAssign, // ~=
     87     add,
     88     min,
     89     addAssign,
     90     minAssign,
     91     mul,
     92     div,
     93     mod,
     94     mulAssign,
     95     divAssign,
     96     modAssign,
     97     and_,
     98     or_,
     99     xor_,
    100     andAssign,
    101     orAssign,
    102     xorAssign,
    103     assign,
    104     not_,
    105     tilde,
    106     plusPlus,
    107     minusMinus,
    108     dot,
    109     comma,
    110     question,
    111     andAnd,
    112     orOr,
    113 
    114     // Numeric literals
    115     int32Literal,
    116     uns32Literal,
    117     int64Literal,
    118     uns64Literal,
    119     int128Literal,
    120     uns128Literal,
    121     float32Literal,
    122     float64Literal,
    123     float80Literal,
    124     imaginary32Literal,
    125     imaginary64Literal,
    126     imaginary80Literal,
    127 
    128     // Char constants
    129     charLiteral,
    130     wcharLiteral,
    131     dcharLiteral,
    132 
    133     // Leaf operators
    134     identifier,
    135     string_,
    136     this_,
    137     super_,
    138     error,
    139 
    140     // Basic types
    141     void_,
    142     int8,
    143     uns8,
    144     int16,
    145     uns16,
    146     int32,
    147     uns32,
    148     int64,
    149     uns64,
    150     int128,
    151     uns128,
    152     float32,
    153     float64,
    154     float80,
    155     imaginary32,
    156     imaginary64,
    157     imaginary80,
    158     complex32,
    159     complex64,
    160     complex80,
    161     char_,
    162     wchar_,
    163     dchar_,
    164     bool_,
    165 
    166     // Aggregates
    167     struct_,
    168     class_,
    169     interface_,
    170     union_,
    171     enum_,
    172     import_,
    173     alias_,
    174     override_,
    175     delegate_,
    176     function_,
    177     mixin_,
    178     align_,
    179     extern_,
    180     private_,
    181     protected_,
    182     public_,
    183     export_,
    184     static_,
    185     final_,
    186     const_,
    187     abstract_,
    188     debug_,
    189     deprecated_,
    190     in_,
    191     out_,
    192     inout_,
    193     lazy_,
    194     auto_,
    195     package_,
    196     immutable_,
    197 
    198     // Statements
    199     if_,
    200     else_,
    201     while_,
    202     for_,
    203     do_,
    204     switch_,
    205     case_,
    206     default_,
    207     break_,
    208     continue_,
    209     with_,
    210     synchronized_,
    211     return_,
    212     goto_,
    213     try_,
    214     catch_,
    215     finally_,
    216     asm_,
    217     foreach_,
    218     foreach_reverse_,
    219     scope_,
    220     onScopeExit,
    221     onScopeFailure,
    222     onScopeSuccess,
    223 
    224     // Contracts
    225     invariant_,
    226 
    227     // Testing
    228     unittest_,
    229 
    230     // Added after 1.0
    231     argumentTypes,
    232     ref_,
    233     macro_,
    234 
    235     parameters,
    236     traits,
    237     pure_,
    238     nothrow_,
    239     gshared,
    240     line,
    241     file,
    242     fileFullPath,
    243     moduleString,   // __MODULE__
    244     functionString, // __FUNCTION__
    245     prettyFunction, // __PRETTY_FUNCTION__
    246     shared_,
    247     at,
    248     pow,
    249     powAssign,
    250     goesTo,
    251     vector,
    252     pound,
    253 
    254     arrow,      // ->
    255     colonColon, // ::
    256     wchar_tLiteral,
    257     endOfLine,  // \n, \r, \u2028, \u2029
    258     whitespace,
    259 
    260     // C only keywords
    261     inline_,
    262     register_,
    263     restrict_,
    264     signed_,
    265     sizeof_,
    266     typedef_,
    267     unsigned_,
    268     volatile_,
    269     _Alignas_,
    270     _Alignof_,
    271     _Atomic_,
    272     _Bool_,
    273     _Complex_,
    274     _Generic_,
    275     _Imaginary_,
    276     _Noreturn_,
    277     _Static_assert_,
    278     _Thread_local_,
    279 
    280     // C only extended keywords
    281     _import,
    282     cdecl_,
    283     declspec,
    284     stdcall,
    285     attribute__,
    286 
    287     MAX,
    288 };
    289 
    290 enum class EXP : unsigned char
    291 {
    292     reserved,
    293 
    294     // Other
    295     negate,
    296     cast_,
    297     null_,
    298     assert_,
    299     true_,
    300     false_,
    301     array,
    302     call,
    303     address,
    304     type,
    305     throw_,
    306     new_,
    307     delete_,
    308     star,
    309     symbolOffset,
    310     variable,
    311     dotVariable,
    312     dotIdentifier,
    313     dotTemplateInstance,
    314     dotType,
    315     slice,
    316     arrayLength,
    317     version_,
    318     dollar,
    319     template_,
    320     dotTemplateDeclaration,
    321     declaration,
    322     typeof_,
    323     pragma_,
    324     dSymbol,
    325     typeid_,
    326     uadd,
    327     remove,
    328     newAnonymousClass,
    329     arrayLiteral,
    330     assocArrayLiteral,
    331     structLiteral,
    332     classReference,
    333     thrownException,
    334     delegatePointer,
    335     delegateFunctionPointer,
    336 
    337     // Operators
    338     lessThan,
    339     greaterThan,
    340     lessOrEqual,
    341     greaterOrEqual,
    342     equal,
    343     notEqual,
    344     identity,
    345     notIdentity,
    346     index,
    347     is_,
    348 
    349     leftShift,
    350     rightShift,
    351     leftShiftAssign,
    352     rightShiftAssign,
    353     unsignedRightShift,
    354     unsignedRightShiftAssign,
    355     concatenate,
    356     concatenateAssign, // ~=
    357     concatenateElemAssign,
    358     concatenateDcharAssign,
    359     add,
    360     min,
    361     addAssign,
    362     minAssign,
    363     mul,
    364     div,
    365     mod,
    366     mulAssign,
    367     divAssign,
    368     modAssign,
    369     and_,
    370     or_,
    371     xor_,
    372     andAssign,
    373     orAssign,
    374     xorAssign,
    375     assign,
    376     not_,
    377     tilde,
    378     plusPlus,
    379     minusMinus,
    380     construct,
    381     blit,
    382     dot,
    383     comma,
    384     question,
    385     andAnd,
    386     orOr,
    387     prePlusPlus,
    388     preMinusMinus,
    389 
    390     // Leaf operators
    391     identifier,
    392     string_,
    393     this_,
    394     super_,
    395     halt,
    396     tuple,
    397     error,
    398 
    399     // Basic types
    400     void_,
    401     int64,
    402     float64,
    403     complex80,
    404     char_,
    405     import_,
    406     delegate_,
    407     function_,
    408     mixin_,
    409     in_,
    410     default_,
    411     break_,
    412     continue_,
    413     goto_,
    414     scope_,
    415 
    416     traits,
    417     overloadSet,
    418     line,
    419     file,
    420     fileFullPath,
    421     moduleString,   // __MODULE__
    422     functionString, // __FUNCTION__
    423     prettyFunction, // __PRETTY_FUNCTION__
    424     shared_,
    425     pow,
    426     powAssign,
    427     vector,
    428 
    429     voidExpression,
    430     cantExpression,
    431     showCtfeContext,
    432     objcClassReference,
    433     vectorArray,
    434     arrow,      // ->
    435     compoundLiteral, // ( type-name ) { initializer-list }
    436     _Generic_,
    437     interval,
    438 
    439     MAX
    440 };
    441 
    442 #define TOKwild TOKinout
    443 
    444 // Token has an anonymous struct, which is not strict ISO C++.
    445 #if defined(__GNUC__)
    446 #pragma GCC diagnostic push
    447 #pragma GCC diagnostic ignored "-Wpedantic"
    448 #endif
    449 
    450 struct Token
    451 {
    452     Token *next;
    453     Loc loc;
    454     const utf8_t *ptr;    // pointer to first character of this token within buffer
    455     TOK value;
    456     DString blockComment; // doc comment string prior to this token
    457     DString lineComment;  // doc comment for previous token
    458     union
    459     {
    460         // Integers
    461         sinteger_t intvalue;
    462         uinteger_t unsvalue;
    463 
    464         // Floats
    465         real_t floatvalue;
    466 
    467         struct
    468         {   utf8_t *ustring;     // UTF8 string
    469             unsigned len;
    470             unsigned char postfix;      // 'c', 'w', 'd'
    471         };
    472 
    473         Identifier *ident;
    474     };
    475 
    476     void free();
    477 
    478     Token() : next(NULL) {}
    479     int isKeyword();
    480     const char *toChars() const;
    481 
    482     static const char *toChars(TOK value);
    483 };
    484 
    485 #if defined(__GNUC__)
    486 #pragma GCC diagnostic pop
    487 #endif
    488