blob: 8732e80c6044ccff88b63ae13e1af02543e689a5 [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 */
Ethan Nicholas0df1b042017-03-31 13:56:23 -04007
ethannicholasb3058bd2016-07-01 08:22:01 -07008#ifndef SKSL_TOKEN
9#define SKSL_TOKEN
10
11#include "SkSLPosition.h"
12#include "SkSLUtil.h"
Ethan Nicholas0df1b042017-03-31 13:56:23 -040013
ethannicholasb3058bd2016-07-01 08:22:01 -070014namespace 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,
Ethan Nicholasbfe15f62017-03-01 11:46:51 -0500111 LOCATION,
112 OFFSET,
113 BINDING,
114 INDEX,
115 SET,
116 BUILTIN,
117 INPUT_ATTACHMENT_INDEX,
118 ORIGIN_UPPER_LEFT,
119 OVERRIDE_COVERAGE,
120 BLEND_SUPPORT_ALL_EQUATIONS,
121 PUSH_CONSTANT,
122 POINTS,
123 LINES,
124 LINE_STRIP,
125 LINES_ADJACENCY,
126 TRIANGLES,
127 TRIANGLE_STRIP,
128 TRIANGLES_ADJACENCY,
129 MAX_VERTICES,
130 INVOCATIONS,
ethannicholasb3058bd2016-07-01 08:22:01 -0700131 INVALID_TOKEN
132 };
133
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400134 static String OperatorName(Kind kind) {
ethannicholasb3058bd2016-07-01 08:22:01 -0700135 switch (kind) {
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400136 case Token::PLUS: return String("+");
137 case Token::MINUS: return String("-");
138 case Token::STAR: return String("*");
139 case Token::SLASH: return String("/");
140 case Token::PERCENT: return String("%");
141 case Token::SHL: return String("<<");
142 case Token::SHR: return String(">>");
143 case Token::LOGICALNOT: return String("!");
144 case Token::LOGICALAND: return String("&&");
145 case Token::LOGICALOR: return String("||");
146 case Token::LOGICALXOR: return String("^^");
147 case Token::BITWISENOT: return String("~");
148 case Token::BITWISEAND: return String("&");
149 case Token::BITWISEOR: return String("|");
150 case Token::BITWISEXOR: return String("^");
151 case Token::EQ: return String("=");
152 case Token::EQEQ: return String("==");
153 case Token::NEQ: return String("!=");
154 case Token::LT: return String("<");
155 case Token::GT: return String(">");
156 case Token::LTEQ: return String("<=");
157 case Token::GTEQ: return String(">=");
158 case Token::PLUSEQ: return String("+=");
159 case Token::MINUSEQ: return String("-=");
160 case Token::STAREQ: return String("*=");
161 case Token::SLASHEQ: return String("/=");
162 case Token::PERCENTEQ: return String("%=");
163 case Token::SHLEQ: return String("<<=");
164 case Token::SHREQ: return String(">>=");
165 case Token::LOGICALANDEQ: return String("&&=");
166 case Token::LOGICALOREQ: return String("||=");
167 case Token::LOGICALXOREQ: return String("^^=");
168 case Token::BITWISEANDEQ: return String("&=");
169 case Token::BITWISEOREQ: return String("|=");
170 case Token::BITWISEXOREQ: return String("^=");
171 case Token::PLUSPLUS: return String("++");
172 case Token::MINUSMINUS: return String("--");
ethannicholasb3058bd2016-07-01 08:22:01 -0700173 default:
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400174 ABORT("unsupported operator: %d\n", kind);
175 }
ethannicholasb3058bd2016-07-01 08:22:01 -0700176 }
177
178 Token() {
179 }
180
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400181 Token(Position position, Kind kind, String text)
ethannicholasb3058bd2016-07-01 08:22:01 -0700182 : fPosition(position)
183 , fKind(kind)
184 , fText(std::move(text)) {}
185
Ethan Nicholas86a43402017-01-19 13:32:00 -0500186 static bool IsAssignment(Token::Kind op) {
187 switch (op) {
188 case Token::EQ: // fall through
189 case Token::PLUSEQ: // fall through
190 case Token::MINUSEQ: // fall through
191 case Token::STAREQ: // fall through
192 case Token::SLASHEQ: // fall through
193 case Token::PERCENTEQ: // fall through
194 case Token::SHLEQ: // fall through
195 case Token::SHREQ: // fall through
196 case Token::BITWISEOREQ: // fall through
197 case Token::BITWISEXOREQ: // fall through
198 case Token::BITWISEANDEQ: // fall through
199 case Token::LOGICALOREQ: // fall through
200 case Token::LOGICALXOREQ: // fall through
201 case Token::LOGICALANDEQ:
202 return true;
203 default:
204 return false;
205 }
206 }
207
ethannicholasb3058bd2016-07-01 08:22:01 -0700208 Position fPosition;
209 Kind fKind;
ethannicholas471e8942016-10-28 09:02:46 -0700210 // will be the empty string unless the token has variable text content (identifiers, numeric
211 // literals, and directives)
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400212 String fText;
ethannicholasb3058bd2016-07-01 08:22:01 -0700213};
214
215} // namespace
216#endif