blob: 70b4ed298e595cce77ba2224e1bf35f35ac92381 [file] [log] [blame]
ethannicholasb3058bd2016-07-01 08:22:01 -07001/*
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 */
7
8#ifndef SKSL_TOKEN
9#define SKSL_TOKEN
10
11#include "SkSLPosition.h"
12#include "SkSLUtil.h"
13
14namespace SkSL {
15
ethannicholasf789b382016-08-03 12:43:36 -070016#undef IN
17#undef OUT
18#undef CONST
19
ethannicholasb3058bd2016-07-01 08:22:01 -070020/**
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 */
24struct 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,
ethannicholas5961bc92016-10-12 06:39:56 -070052 BITWISENOT,
ethannicholasb3058bd2016-07-01 08:22:01 -070053 LOGICALOR,
54 LOGICALXOR,
55 LOGICALAND,
ethannicholas5961bc92016-10-12 06:39:56 -070056 LOGICALNOT,
ethannicholasb3058bd2016-07-01 08:22:01 -070057 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 Nicholasaf197692017-02-27 13:26:45 -050085 SWITCH,
86 CASE,
87 DEFAULT,
ethannicholasb3058bd2016-07-01 08:22:01 -070088 RETURN,
89 BREAK,
90 CONTINUE,
91 DISCARD,
92 IN,
93 OUT,
94 INOUT,
95 CONST,
96 LOWP,
97 MEDIUMP,
98 HIGHP,
99 UNIFORM,
ethannicholasf789b382016-08-03 12:43:36 -0700100 FLAT,
101 NOPERSPECTIVE,
Brian Salomonf9f45122016-11-29 11:59:17 -0500102 READONLY,
103 WRITEONLY,
104 COHERENT,
105 VOLATILE,
106 RESTRICT,
ethannicholasb3058bd2016-07-01 08:22:01 -0700107 STRUCT,
108 LAYOUT,
109 DIRECTIVE,
110 PRECISION,
111 INVALID_TOKEN
112 };
113
Ethan Nicholas9e1138d2016-11-21 10:39:35 -0500114 static SkString OperatorName(Kind kind) {
ethannicholasb3058bd2016-07-01 08:22:01 -0700115 switch (kind) {
Ethan Nicholas9e1138d2016-11-21 10:39:35 -0500116 case Token::PLUS: return SkString("+");
117 case Token::MINUS: return SkString("-");
118 case Token::STAR: return SkString("*");
119 case Token::SLASH: return SkString("/");
120 case Token::PERCENT: return SkString("%");
121 case Token::SHL: return SkString("<<");
122 case Token::SHR: return SkString(">>");
123 case Token::LOGICALNOT: return SkString("!");
124 case Token::LOGICALAND: return SkString("&&");
125 case Token::LOGICALOR: return SkString("||");
126 case Token::LOGICALXOR: return SkString("^^");
127 case Token::BITWISENOT: return SkString("~");
128 case Token::BITWISEAND: return SkString("&");
129 case Token::BITWISEOR: return SkString("|");
130 case Token::BITWISEXOR: return SkString("^");
131 case Token::EQ: return SkString("=");
132 case Token::EQEQ: return SkString("==");
133 case Token::NEQ: return SkString("!=");
134 case Token::LT: return SkString("<");
135 case Token::GT: return SkString(">");
136 case Token::LTEQ: return SkString("<=");
137 case Token::GTEQ: return SkString(">=");
138 case Token::PLUSEQ: return SkString("+=");
139 case Token::MINUSEQ: return SkString("-=");
140 case Token::STAREQ: return SkString("*=");
141 case Token::SLASHEQ: return SkString("/=");
142 case Token::PERCENTEQ: return SkString("%=");
143 case Token::SHLEQ: return SkString("<<=");
144 case Token::SHREQ: return SkString(">>=");
145 case Token::LOGICALANDEQ: return SkString("&&=");
146 case Token::LOGICALOREQ: return SkString("||=");
147 case Token::LOGICALXOREQ: return SkString("^^=");
148 case Token::BITWISEANDEQ: return SkString("&=");
149 case Token::BITWISEOREQ: return SkString("|=");
150 case Token::BITWISEXOREQ: return SkString("^=");
151 case Token::PLUSPLUS: return SkString("++");
152 case Token::MINUSMINUS: return SkString("--");
ethannicholasb3058bd2016-07-01 08:22:01 -0700153 default:
154 ABORT("unsupported operator: %d\n", kind);
155 }
156 }
157
158 Token() {
159 }
160
Ethan Nicholas9e1138d2016-11-21 10:39:35 -0500161 Token(Position position, Kind kind, SkString text)
ethannicholasb3058bd2016-07-01 08:22:01 -0700162 : fPosition(position)
163 , fKind(kind)
164 , fText(std::move(text)) {}
165
Ethan Nicholas86a43402017-01-19 13:32:00 -0500166 static bool IsAssignment(Token::Kind op) {
167 switch (op) {
168 case Token::EQ: // fall through
169 case Token::PLUSEQ: // fall through
170 case Token::MINUSEQ: // fall through
171 case Token::STAREQ: // fall through
172 case Token::SLASHEQ: // fall through
173 case Token::PERCENTEQ: // fall through
174 case Token::SHLEQ: // fall through
175 case Token::SHREQ: // fall through
176 case Token::BITWISEOREQ: // fall through
177 case Token::BITWISEXOREQ: // fall through
178 case Token::BITWISEANDEQ: // fall through
179 case Token::LOGICALOREQ: // fall through
180 case Token::LOGICALXOREQ: // fall through
181 case Token::LOGICALANDEQ:
182 return true;
183 default:
184 return false;
185 }
186 }
187
ethannicholasb3058bd2016-07-01 08:22:01 -0700188 Position fPosition;
189 Kind fKind;
ethannicholas471e8942016-10-28 09:02:46 -0700190 // will be the empty string unless the token has variable text content (identifiers, numeric
191 // literals, and directives)
Ethan Nicholas9e1138d2016-11-21 10:39:35 -0500192 SkString fText;
ethannicholasb3058bd2016-07-01 08:22:01 -0700193};
194
195} // namespace
196#endif