| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SKSL_TOKEN |
| #define SKSL_TOKEN |
| |
| #include "SkSLPosition.h" |
| #include "SkSLUtil.h" |
| |
| namespace SkSL { |
| |
| #undef IN |
| #undef OUT |
| #undef CONST |
| |
| /** |
| * Represents a lexical analysis token. Token is generally only used during the parse process, but |
| * Token::Kind is also used to represent operator kinds. |
| */ |
| struct Token { |
| enum Kind { |
| END_OF_FILE, |
| WHITESPACE, |
| IDENTIFIER, |
| INT_LITERAL, |
| FLOAT_LITERAL, |
| TRUE_LITERAL, |
| FALSE_LITERAL, |
| LPAREN, |
| RPAREN, |
| LBRACE, |
| RBRACE, |
| LBRACKET, |
| RBRACKET, |
| DOT, |
| COMMA, |
| PLUSPLUS, |
| MINUSMINUS, |
| PLUS, |
| MINUS, |
| STAR, |
| SLASH, |
| PERCENT, |
| SHL, |
| SHR, |
| BITWISEOR, |
| BITWISEXOR, |
| BITWISEAND, |
| BITWISENOT, |
| LOGICALOR, |
| LOGICALXOR, |
| LOGICALAND, |
| LOGICALNOT, |
| QUESTION, |
| COLON, |
| EQ, |
| EQEQ, |
| NEQ, |
| GT, |
| LT, |
| GTEQ, |
| LTEQ, |
| PLUSEQ, |
| MINUSEQ, |
| STAREQ, |
| SLASHEQ, |
| PERCENTEQ, |
| SHLEQ, |
| SHREQ, |
| BITWISEOREQ, |
| BITWISEXOREQ, |
| BITWISEANDEQ, |
| LOGICALOREQ, |
| LOGICALXOREQ, |
| LOGICALANDEQ, |
| SEMICOLON, |
| ARROW, |
| COLONCOLON, |
| IF, |
| STATIC_IF, |
| ELSE, |
| FOR, |
| WHILE, |
| DO, |
| SWITCH, |
| STATIC_SWITCH, |
| CASE, |
| DEFAULT, |
| RETURN, |
| BREAK, |
| CONTINUE, |
| DISCARD, |
| IN, |
| OUT, |
| INOUT, |
| CONST, |
| LOWP, |
| MEDIUMP, |
| HIGHP, |
| UNIFORM, |
| FLAT, |
| NOPERSPECTIVE, |
| READONLY, |
| WRITEONLY, |
| COHERENT, |
| VOLATILE, |
| RESTRICT, |
| BUFFER, |
| HASSIDEEFFECTS, |
| STRUCT, |
| LAYOUT, |
| DIRECTIVE, |
| SECTION, |
| PRECISION, |
| LOCATION, |
| OFFSET, |
| BINDING, |
| INDEX, |
| SET, |
| BUILTIN, |
| INPUT_ATTACHMENT_INDEX, |
| ORIGIN_UPPER_LEFT, |
| OVERRIDE_COVERAGE, |
| BLEND_SUPPORT_ALL_EQUATIONS, |
| PUSH_CONSTANT, |
| POINTS, |
| LINES, |
| LINE_STRIP, |
| LINES_ADJACENCY, |
| TRIANGLES, |
| TRIANGLE_STRIP, |
| TRIANGLES_ADJACENCY, |
| MAX_VERTICES, |
| INVOCATIONS, |
| WHEN, |
| KEY, |
| INVALID_TOKEN |
| }; |
| |
| static String OperatorName(Kind kind) { |
| switch (kind) { |
| case Token::PLUS: return String("+"); |
| case Token::MINUS: return String("-"); |
| case Token::STAR: return String("*"); |
| case Token::SLASH: return String("/"); |
| case Token::PERCENT: return String("%"); |
| case Token::SHL: return String("<<"); |
| case Token::SHR: return String(">>"); |
| case Token::LOGICALNOT: return String("!"); |
| case Token::LOGICALAND: return String("&&"); |
| case Token::LOGICALOR: return String("||"); |
| case Token::LOGICALXOR: return String("^^"); |
| case Token::BITWISENOT: return String("~"); |
| case Token::BITWISEAND: return String("&"); |
| case Token::BITWISEOR: return String("|"); |
| case Token::BITWISEXOR: return String("^"); |
| case Token::EQ: return String("="); |
| case Token::EQEQ: return String("=="); |
| case Token::NEQ: return String("!="); |
| case Token::LT: return String("<"); |
| case Token::GT: return String(">"); |
| case Token::LTEQ: return String("<="); |
| case Token::GTEQ: return String(">="); |
| case Token::PLUSEQ: return String("+="); |
| case Token::MINUSEQ: return String("-="); |
| case Token::STAREQ: return String("*="); |
| case Token::SLASHEQ: return String("/="); |
| case Token::PERCENTEQ: return String("%="); |
| case Token::SHLEQ: return String("<<="); |
| case Token::SHREQ: return String(">>="); |
| case Token::LOGICALANDEQ: return String("&&="); |
| case Token::LOGICALOREQ: return String("||="); |
| case Token::LOGICALXOREQ: return String("^^="); |
| case Token::BITWISEANDEQ: return String("&="); |
| case Token::BITWISEOREQ: return String("|="); |
| case Token::BITWISEXOREQ: return String("^="); |
| case Token::PLUSPLUS: return String("++"); |
| case Token::MINUSMINUS: return String("--"); |
| case Token::COMMA: return String(","); |
| default: |
| ABORT("unsupported operator: %d\n", kind); |
| } |
| } |
| |
| Token() { |
| } |
| |
| Token(Position position, Kind kind, String text) |
| : fPosition(position) |
| , fKind(kind) |
| , fText(std::move(text)) {} |
| |
| static bool IsAssignment(Token::Kind op) { |
| switch (op) { |
| case Token::EQ: // fall through |
| case Token::PLUSEQ: // fall through |
| case Token::MINUSEQ: // fall through |
| case Token::STAREQ: // fall through |
| case Token::SLASHEQ: // fall through |
| case Token::PERCENTEQ: // fall through |
| case Token::SHLEQ: // fall through |
| case Token::SHREQ: // fall through |
| case Token::BITWISEOREQ: // fall through |
| case Token::BITWISEXOREQ: // fall through |
| case Token::BITWISEANDEQ: // fall through |
| case Token::LOGICALOREQ: // fall through |
| case Token::LOGICALXOREQ: // fall through |
| case Token::LOGICALANDEQ: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| Position fPosition; |
| Kind fKind; |
| // will be the empty string unless the token has variable text content (identifiers, numeric |
| // literals, and directives) |
| String fText; |
| }; |
| |
| } // namespace |
| #endif |