blob: 874c7ebd1b9cd587f800318acad525f894e77051 [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,
Ethan Nicholascb670962017-04-20 19:31:52 -0400107 HASSIDEEFFECTS,
ethannicholasb3058bd2016-07-01 08:22:01 -0700108 STRUCT,
109 LAYOUT,
110 DIRECTIVE,
111 PRECISION,
Ethan Nicholasbfe15f62017-03-01 11:46:51 -0500112 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,
ethannicholasb3058bd2016-07-01 08:22:01 -0700132 INVALID_TOKEN
133 };
134
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400135 static String OperatorName(Kind kind) {
ethannicholasb3058bd2016-07-01 08:22:01 -0700136 switch (kind) {
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400137 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("--");
ethannicholasb3058bd2016-07-01 08:22:01 -0700174 default:
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400175 ABORT("unsupported operator: %d\n", kind);
176 }
ethannicholasb3058bd2016-07-01 08:22:01 -0700177 }
178
179 Token() {
180 }
181
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400182 Token(Position position, Kind kind, String text)
ethannicholasb3058bd2016-07-01 08:22:01 -0700183 : fPosition(position)
184 , fKind(kind)
185 , fText(std::move(text)) {}
186
Ethan Nicholas86a43402017-01-19 13:32:00 -0500187 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
ethannicholasb3058bd2016-07-01 08:22:01 -0700209 Position fPosition;
210 Kind fKind;
ethannicholas471e8942016-10-28 09:02:46 -0700211 // will be the empty string unless the token has variable text content (identifiers, numeric
212 // literals, and directives)
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400213 String fText;
ethannicholasb3058bd2016-07-01 08:22:01 -0700214};
215
216} // namespace
217#endif