blob: 2857a82547201ea23e107faef49e1046bcef2899 [file] [log] [blame]
/*
* 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