ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2016 Google Inc. |
| 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license that can be |
| 5 | * found in the LICENSE file. |
| 6 | */ |
Ethan Nicholas | 0df1b04 | 2017-03-31 13:56:23 -0400 | [diff] [blame] | 7 | |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 8 | #ifndef SKSL_TOKEN |
| 9 | #define SKSL_TOKEN |
| 10 | |
| 11 | #include "SkSLPosition.h" |
| 12 | #include "SkSLUtil.h" |
Ethan Nicholas | 0df1b04 | 2017-03-31 13:56:23 -0400 | [diff] [blame] | 13 | |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 14 | namespace SkSL { |
| 15 | |
ethannicholas | f789b38 | 2016-08-03 12:43:36 -0700 | [diff] [blame] | 16 | #undef IN |
| 17 | #undef OUT |
| 18 | #undef CONST |
| 19 | |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 20 | /** |
| 21 | * Represents a lexical analysis token. Token is generally only used during the parse process, but |
| 22 | * Token::Kind is also used to represent operator kinds. |
| 23 | */ |
| 24 | struct Token { |
| 25 | enum Kind { |
| 26 | END_OF_FILE, |
| 27 | IDENTIFIER, |
| 28 | INT_LITERAL, |
| 29 | FLOAT_LITERAL, |
| 30 | TRUE_LITERAL, |
| 31 | FALSE_LITERAL, |
| 32 | LPAREN, |
| 33 | RPAREN, |
| 34 | LBRACE, |
| 35 | RBRACE, |
| 36 | LBRACKET, |
| 37 | RBRACKET, |
| 38 | DOT, |
| 39 | COMMA, |
| 40 | PLUSPLUS, |
| 41 | MINUSMINUS, |
| 42 | PLUS, |
| 43 | MINUS, |
| 44 | STAR, |
| 45 | SLASH, |
| 46 | PERCENT, |
| 47 | SHL, |
| 48 | SHR, |
| 49 | BITWISEOR, |
| 50 | BITWISEXOR, |
| 51 | BITWISEAND, |
ethannicholas | 5961bc9 | 2016-10-12 06:39:56 -0700 | [diff] [blame] | 52 | BITWISENOT, |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 53 | LOGICALOR, |
| 54 | LOGICALXOR, |
| 55 | LOGICALAND, |
ethannicholas | 5961bc9 | 2016-10-12 06:39:56 -0700 | [diff] [blame] | 56 | LOGICALNOT, |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 57 | QUESTION, |
| 58 | COLON, |
| 59 | EQ, |
| 60 | EQEQ, |
| 61 | NEQ, |
| 62 | GT, |
| 63 | LT, |
| 64 | GTEQ, |
| 65 | LTEQ, |
| 66 | PLUSEQ, |
| 67 | MINUSEQ, |
| 68 | STAREQ, |
| 69 | SLASHEQ, |
| 70 | PERCENTEQ, |
| 71 | SHLEQ, |
| 72 | SHREQ, |
| 73 | BITWISEOREQ, |
| 74 | BITWISEXOREQ, |
| 75 | BITWISEANDEQ, |
| 76 | LOGICALOREQ, |
| 77 | LOGICALXOREQ, |
| 78 | LOGICALANDEQ, |
| 79 | SEMICOLON, |
| 80 | IF, |
| 81 | ELSE, |
| 82 | FOR, |
| 83 | WHILE, |
| 84 | DO, |
Ethan Nicholas | af19769 | 2017-02-27 13:26:45 -0500 | [diff] [blame] | 85 | SWITCH, |
| 86 | CASE, |
| 87 | DEFAULT, |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 88 | RETURN, |
| 89 | BREAK, |
| 90 | CONTINUE, |
| 91 | DISCARD, |
| 92 | IN, |
| 93 | OUT, |
| 94 | INOUT, |
| 95 | CONST, |
| 96 | LOWP, |
| 97 | MEDIUMP, |
| 98 | HIGHP, |
| 99 | UNIFORM, |
ethannicholas | f789b38 | 2016-08-03 12:43:36 -0700 | [diff] [blame] | 100 | FLAT, |
| 101 | NOPERSPECTIVE, |
Brian Salomon | f9f4512 | 2016-11-29 11:59:17 -0500 | [diff] [blame] | 102 | READONLY, |
| 103 | WRITEONLY, |
| 104 | COHERENT, |
| 105 | VOLATILE, |
| 106 | RESTRICT, |
Ethan Nicholas | cb67096 | 2017-04-20 19:31:52 -0400 | [diff] [blame] | 107 | HASSIDEEFFECTS, |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 108 | STRUCT, |
| 109 | LAYOUT, |
| 110 | DIRECTIVE, |
| 111 | PRECISION, |
Ethan Nicholas | bfe15f6 | 2017-03-01 11:46:51 -0500 | [diff] [blame] | 112 | LOCATION, |
| 113 | OFFSET, |
| 114 | BINDING, |
| 115 | INDEX, |
| 116 | SET, |
| 117 | BUILTIN, |
| 118 | INPUT_ATTACHMENT_INDEX, |
| 119 | ORIGIN_UPPER_LEFT, |
| 120 | OVERRIDE_COVERAGE, |
| 121 | BLEND_SUPPORT_ALL_EQUATIONS, |
| 122 | PUSH_CONSTANT, |
| 123 | POINTS, |
| 124 | LINES, |
| 125 | LINE_STRIP, |
| 126 | LINES_ADJACENCY, |
| 127 | TRIANGLES, |
| 128 | TRIANGLE_STRIP, |
| 129 | TRIANGLES_ADJACENCY, |
| 130 | MAX_VERTICES, |
| 131 | INVOCATIONS, |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 132 | INVALID_TOKEN |
| 133 | }; |
| 134 | |
Ethan Nicholas | 0df1b04 | 2017-03-31 13:56:23 -0400 | [diff] [blame] | 135 | static String OperatorName(Kind kind) { |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 136 | switch (kind) { |
Ethan Nicholas | 0df1b04 | 2017-03-31 13:56:23 -0400 | [diff] [blame] | 137 | case Token::PLUS: return String("+"); |
| 138 | case Token::MINUS: return String("-"); |
| 139 | case Token::STAR: return String("*"); |
| 140 | case Token::SLASH: return String("/"); |
| 141 | case Token::PERCENT: return String("%"); |
| 142 | case Token::SHL: return String("<<"); |
| 143 | case Token::SHR: return String(">>"); |
| 144 | case Token::LOGICALNOT: return String("!"); |
| 145 | case Token::LOGICALAND: return String("&&"); |
| 146 | case Token::LOGICALOR: return String("||"); |
| 147 | case Token::LOGICALXOR: return String("^^"); |
| 148 | case Token::BITWISENOT: return String("~"); |
| 149 | case Token::BITWISEAND: return String("&"); |
| 150 | case Token::BITWISEOR: return String("|"); |
| 151 | case Token::BITWISEXOR: return String("^"); |
| 152 | case Token::EQ: return String("="); |
| 153 | case Token::EQEQ: return String("=="); |
| 154 | case Token::NEQ: return String("!="); |
| 155 | case Token::LT: return String("<"); |
| 156 | case Token::GT: return String(">"); |
| 157 | case Token::LTEQ: return String("<="); |
| 158 | case Token::GTEQ: return String(">="); |
| 159 | case Token::PLUSEQ: return String("+="); |
| 160 | case Token::MINUSEQ: return String("-="); |
| 161 | case Token::STAREQ: return String("*="); |
| 162 | case Token::SLASHEQ: return String("/="); |
| 163 | case Token::PERCENTEQ: return String("%="); |
| 164 | case Token::SHLEQ: return String("<<="); |
| 165 | case Token::SHREQ: return String(">>="); |
| 166 | case Token::LOGICALANDEQ: return String("&&="); |
| 167 | case Token::LOGICALOREQ: return String("||="); |
| 168 | case Token::LOGICALXOREQ: return String("^^="); |
| 169 | case Token::BITWISEANDEQ: return String("&="); |
| 170 | case Token::BITWISEOREQ: return String("|="); |
| 171 | case Token::BITWISEXOREQ: return String("^="); |
| 172 | case Token::PLUSPLUS: return String("++"); |
| 173 | case Token::MINUSMINUS: return String("--"); |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 174 | default: |
Ethan Nicholas | 0df1b04 | 2017-03-31 13:56:23 -0400 | [diff] [blame] | 175 | ABORT("unsupported operator: %d\n", kind); |
| 176 | } |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 177 | } |
| 178 | |
| 179 | Token() { |
| 180 | } |
| 181 | |
Ethan Nicholas | 0df1b04 | 2017-03-31 13:56:23 -0400 | [diff] [blame] | 182 | Token(Position position, Kind kind, String text) |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 183 | : fPosition(position) |
| 184 | , fKind(kind) |
| 185 | , fText(std::move(text)) {} |
| 186 | |
Ethan Nicholas | 86a4340 | 2017-01-19 13:32:00 -0500 | [diff] [blame] | 187 | static bool IsAssignment(Token::Kind op) { |
| 188 | switch (op) { |
| 189 | case Token::EQ: // fall through |
| 190 | case Token::PLUSEQ: // fall through |
| 191 | case Token::MINUSEQ: // fall through |
| 192 | case Token::STAREQ: // fall through |
| 193 | case Token::SLASHEQ: // fall through |
| 194 | case Token::PERCENTEQ: // fall through |
| 195 | case Token::SHLEQ: // fall through |
| 196 | case Token::SHREQ: // fall through |
| 197 | case Token::BITWISEOREQ: // fall through |
| 198 | case Token::BITWISEXOREQ: // fall through |
| 199 | case Token::BITWISEANDEQ: // fall through |
| 200 | case Token::LOGICALOREQ: // fall through |
| 201 | case Token::LOGICALXOREQ: // fall through |
| 202 | case Token::LOGICALANDEQ: |
| 203 | return true; |
| 204 | default: |
| 205 | return false; |
| 206 | } |
| 207 | } |
| 208 | |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 209 | Position fPosition; |
| 210 | Kind fKind; |
ethannicholas | 471e894 | 2016-10-28 09:02:46 -0700 | [diff] [blame] | 211 | // will be the empty string unless the token has variable text content (identifiers, numeric |
| 212 | // literals, and directives) |
Ethan Nicholas | 0df1b04 | 2017-03-31 13:56:23 -0400 | [diff] [blame] | 213 | String fText; |
ethannicholas | b3058bd | 2016-07-01 08:22:01 -0700 | [diff] [blame] | 214 | }; |
| 215 | |
| 216 | } // namespace |
| 217 | #endif |