OpenVDB 12.1.0

Loading...
Searching...
No Matches
Tokens.h
Go to the documentation of this file.
1// Copyright Contributors to the OpenVDB Project
2// SPDX-License-Identifier: Apache-2.0
3
4/// @file ast/Tokens.h
5///
6/// @authors Nick Avramoussis
7///
8/// @brief Various function and operator tokens used throughout the
9/// AST and code generation
10///
11
12#ifndef OPENVDB_AX_AST_TOKENS_HAS_BEEN_INCLUDED
13#define OPENVDB_AX_AST_TOKENS_HAS_BEEN_INCLUDED
14
15#include "../Exceptions.h"
16
17#include <openvdb/version.h>
18#include <openvdb/Types.h>
19
20#include <stdexcept>
21
22 namespace openvdb {
23 OPENVDB_USE_VERSION_NAMESPACE
24 namespace OPENVDB_VERSION_NAME {
25
26 namespace ax {
27 namespace ast {
28
29 namespace tokens {
30
31 enum CoreType
32{
33 BOOL = 0,
34 CHAR,
35 INT16,
36 INT32,
37 INT64,
38 FLOAT,
39 DOUBLE,
40 //
41 VEC2I,
42 VEC2F,
43 VEC2D,
44 //
45 VEC3I,
46 VEC3F,
47 VEC3D,
48 //
49 VEC4I,
50 VEC4F,
51 VEC4D,
52 //
53 MAT3F,
54 MAT3D,
55 //
56 MAT4F,
57 MAT4D,
58 //
59 QUATF,
60 QUATD,
61 //
62 STRING,
63 UNKNOWN
64};
65
66 inline CoreType tokenFromTypeString(const std::string& type)
67{
68 if (type[0] == 'v') {
69 if (type == "vec2i") return VEC2I;
70 if (type == "vec2f") return VEC2F;
71 if (type == "vec2d") return VEC2D;
72 if (type == "vec3i") return VEC3I;
73 if (type == "vec3f") return VEC3F;
74 if (type == "vec3d") return VEC3D;
75 if (type == "vec4i") return VEC4I;
76 if (type == "vec4f") return VEC4F;
77 if (type == "vec4d") return VEC4D;
78 }
79 else if (type[0] == 'm') {
80 if (type == "mat3f") return MAT3F;
81 if (type == "mat3d") return MAT3D;
82 if (type == "mat4f") return MAT4F;
83 if (type == "mat4d") return MAT4D;
84 }
85 else if (type[0] == 'q') {
86 if (type == "quatf") return QUATF;
87 if (type == "quatd") return QUATD;
88 }
89 else if (type[0] == 'i') {
90 if (type == "int16") return INT16;
91 if (type == "int") return INT32;
92 if (type == "int32") return INT32;
93 if (type == "int64") return INT64;
94 }
95 else if (type == "bool") return BOOL;
96 else if (type == "char") return CHAR;
97 else if (type == "float") return FLOAT;
98 else if (type == "double") return DOUBLE;
99 else if (type == "string") return STRING;
100
101 // also handle vdb types that have different type strings to our tokens
102 // @todo These should probably be separated out. The executables currently
103 // use this function to guarantee conversion
104 if (type[0] == 'v') {
105 if (type == "vec2s") return VEC2F;
106 if (type == "vec3s") return VEC3F;
107 if (type == "vec4s") return VEC4F;
108 }
109 else if (type[0] == 'm') {
110 if (type == "mat3s") return MAT3F;
111 if (type == "mat4s") return MAT4F;
112 }
113 else if (type == "quats") return QUATF;
114
115 return UNKNOWN;
116}
117
118 inline std::string typeStringFromToken(const CoreType type)
119{
120 switch (type) {
121 case BOOL : return "bool";
122 case CHAR : return "char";
123 case INT16 : return "int16";
124 case INT32 : return "int32";
125 case INT64 : return "int64";
126 case FLOAT : return "float";
127 case DOUBLE : return "double";
128 case VEC2I : return "vec2i";
129 case VEC2F : return "vec2f";
130 case VEC2D : return "vec2d";
131 case VEC3I : return "vec3i";
132 case VEC3F : return "vec3f";
133 case VEC3D : return "vec3d";
134 case VEC4I : return "vec4i";
135 case VEC4F : return "vec4f";
136 case VEC4D : return "vec4d";
137 case MAT3F : return "mat3f";
138 case MAT3D : return "mat3d";
139 case MAT4F : return "mat4f";
140 case MAT4D : return "mat4d";
141 case QUATF : return "quatf";
142 case QUATD : return "quatd";
143 case STRING : return "string";
144 case UNKNOWN :
145 default :
146 return "unknown";
147 }
148}
149
150 enum OperatorToken
151{
152 ////////////////////////////////////////////////////////////////
153 /// ARITHMETIC
154 ////////////////////////////////////////////////////////////////
155 PLUS = 0,
156 MINUS,
157 MULTIPLY,
158 DIVIDE,
159 MODULO,
160 ////////////////////////////////////////////////////////////////
161 /// LOGICAL
162 ////////////////////////////////////////////////////////////////
163 AND,
164 OR,
165 NOT,
166 ////////////////////////////////////////////////////////////////
167 /// RELATIONAL
168 ////////////////////////////////////////////////////////////////
169 EQUALSEQUALS,
170 NOTEQUALS,
171 MORETHAN,
172 LESSTHAN,
173 MORETHANOREQUAL,
174 LESSTHANOREQUAL,
175 ////////////////////////////////////////////////////////////////
176 /// BITWISE
177 ////////////////////////////////////////////////////////////////
178 SHIFTLEFT,
179 SHIFTRIGHT,
180 BITAND,
181 BITOR,
182 BITXOR,
183 BITNOT,
184 ////////////////////////////////////////////////////////////////
185 /// ASSIGNMENT
186 ////////////////////////////////////////////////////////////////
187 EQUALS,
188 PLUSEQUALS,
189 MINUSEQUALS,
190 MULTIPLYEQUALS,
191 DIVIDEEQUALS,
192 MODULOEQUALS,
193 SHIFTLEFTEQUALS,
194 SHIFTRIGHTEQUALS,
195 BITANDEQUALS,
196 BITXOREQUALS,
197 BITOREQUALS
198};
199
200 enum OperatorType
201{
202 ARITHMETIC = 0,
203 LOGICAL,
204 RELATIONAL,
205 BITWISE,
206 ASSIGNMENT,
207 UNKNOWN_OPERATOR
208};
209
210 inline OperatorType operatorType(const OperatorToken token)
211{
212 const size_t idx = static_cast<size_t>(token);
213 if (idx <= static_cast<size_t>(MODULO)) return ARITHMETIC;
214 if (idx <= static_cast<size_t>(NOT)) return LOGICAL;
215 if (idx <= static_cast<size_t>(LESSTHANOREQUAL)) return RELATIONAL;
216 if (idx <= static_cast<size_t>(BITNOT)) return BITWISE;
217 if (idx <= static_cast<size_t>(BITOREQUALS)) return ASSIGNMENT;
218 return UNKNOWN_OPERATOR;
219}
220
221 inline OperatorToken operatorTokenFromName(const std::string& name)
222{
223 if (name == "+") return PLUS;
224 if (name == "-") return MINUS;
225 if (name == "*") return MULTIPLY;
226 if (name == "/") return DIVIDE;
227 if (name == "%") return MODULO;
228 if (name == "&&") return AND;
229 if (name == "||") return OR;
230 if (name == "!") return NOT;
231 if (name == "==") return EQUALSEQUALS;
232 if (name == "!=") return NOTEQUALS;
233 if (name == ">") return MORETHAN;
234 if (name == "<") return LESSTHAN;
235 if (name == ">=") return MORETHANOREQUAL;
236 if (name == "<=") return LESSTHANOREQUAL;
237 if (name == "<<") return SHIFTLEFT;
238 if (name == ">>") return SHIFTRIGHT;
239 if (name == "&") return BITAND;
240 if (name == "|") return BITOR;
241 if (name == "^") return BITXOR;
242 if (name == "~") return BITNOT;
243 if (name == "=") return EQUALS;
244 if (name == "+=") return PLUSEQUALS;
245 if (name == "-=") return MINUSEQUALS;
246 if (name == "*=") return MULTIPLYEQUALS;
247 if (name == "/=") return DIVIDEEQUALS;
248 if (name == "%=") return MODULOEQUALS;
249 if (name == "<<=") return SHIFTLEFTEQUALS;
250 if (name == ">>=") return SHIFTRIGHTEQUALS;
251 if (name == "&=") return BITANDEQUALS;
252 if (name == "^=") return BITXOREQUALS;
253 if (name == "|=") return BITOREQUALS;
254 OPENVDB_THROW(AXTokenError, "Unsupported op \"" + name + "\"");
255}
256
257 inline std::string operatorNameFromToken(const OperatorToken token)
258{
259 switch (token) {
260 case PLUS : return "+";
261 case MINUS : return "-";
262 case MULTIPLY : return "*";
263 case DIVIDE : return "/";
264 case MODULO : return "%";
265 case AND : return "&&";
266 case OR : return "||";
267 case NOT : return "!";
268 case EQUALSEQUALS : return "==";
269 case NOTEQUALS : return "!=";
270 case MORETHAN : return ">";
271 case LESSTHAN : return "<";
272 case MORETHANOREQUAL : return ">=";
273 case LESSTHANOREQUAL : return "<=";
274 case SHIFTLEFT : return "<<";
275 case SHIFTRIGHT : return ">>";
276 case BITAND : return "&";
277 case BITOR : return "|";
278 case BITXOR : return "^";
279 case BITNOT : return "~";
280 case EQUALS : return "=";
281 case PLUSEQUALS : return "+=";
282 case MINUSEQUALS : return "-=";
283 case MULTIPLYEQUALS : return "*=";
284 case DIVIDEEQUALS : return "/=";
285 case MODULOEQUALS : return "%=";
286 case SHIFTLEFTEQUALS : return "<<=";
287 case SHIFTRIGHTEQUALS : return ">>=";
288 case BITANDEQUALS : return "&=";
289 case BITXOREQUALS : return "^=";
290 case BITOREQUALS : return "|=";
291 default :
292 OPENVDB_THROW(AXTokenError, "Unsupported op");
293 }
294}
295
296 enum LoopToken
297{
298 FOR = 0,
299 DO,
300 WHILE
301};
302
303 inline std::string loopNameFromToken(const LoopToken loop)
304{
305 switch (loop) {
306 case FOR : return "for";
307 case DO : return "do";
308 case WHILE : return "while";
309 default :
310 OPENVDB_THROW(AXTokenError, "Unsupported loop");
311 }
312}
313
314 enum KeywordToken
315{
316 RETURN = 0,
317 BREAK,
318 CONTINUE
319};
320
321 inline std::string keywordNameFromToken(const KeywordToken keyw)
322{
323 switch (keyw) {
324 case RETURN : return "return";
325 case BREAK : return "break";
326 case CONTINUE : return "continue";
327 default :
328 OPENVDB_THROW(AXTokenError, "Unsupported keyword");
329 }
330}
331
332
333} // namespace tokens
334
335} // namespace ast
336} // namespace ax
337} // namespace OPENVDB_VERSION_NAME
338} // namespace openvdb
339
340#endif // OPENVDB_AX_AST_TOKENS_HAS_BEEN_INCLUDED
341
Exceptions.h
OpenVDB AX Exceptions.
openvdb::v12_1::AXTokenError
Definition Exceptions.h:36
openvdb::v12_1::ax::ast::tokens
Definition Tokens.h:29
openvdb::v12_1::ax::ast::tokens::operatorNameFromToken
std::string operatorNameFromToken(const OperatorToken token)
Definition Tokens.h:257
openvdb::v12_1::ax::ast::tokens::OperatorToken
OperatorToken
Definition Tokens.h:151
openvdb::v12_1::ax::ast::tokens::NOT
@ NOT
Definition Tokens.h:165
openvdb::v12_1::ax::ast::tokens::BITOR
@ BITOR
Definition Tokens.h:181
openvdb::v12_1::ax::ast::tokens::DIVIDE
@ DIVIDE
Definition Tokens.h:158
openvdb::v12_1::ax::ast::tokens::LESSTHANOREQUAL
@ LESSTHANOREQUAL
Definition Tokens.h:174
openvdb::v12_1::ax::ast::tokens::SHIFTRIGHT
@ SHIFTRIGHT
Definition Tokens.h:179
openvdb::v12_1::ax::ast::tokens::BITNOT
@ BITNOT
Definition Tokens.h:183
openvdb::v12_1::ax::ast::tokens::MORETHANOREQUAL
@ MORETHANOREQUAL
Definition Tokens.h:173
openvdb::v12_1::ax::ast::tokens::MINUSEQUALS
@ MINUSEQUALS
Definition Tokens.h:189
openvdb::v12_1::ax::ast::tokens::SHIFTLEFTEQUALS
@ SHIFTLEFTEQUALS
Definition Tokens.h:193
openvdb::v12_1::ax::ast::tokens::BITOREQUALS
@ BITOREQUALS
Definition Tokens.h:197
openvdb::v12_1::ax::ast::tokens::BITXOREQUALS
@ BITXOREQUALS
Definition Tokens.h:196
openvdb::v12_1::ax::ast::tokens::MODULOEQUALS
@ MODULOEQUALS
Definition Tokens.h:192
openvdb::v12_1::ax::ast::tokens::PLUSEQUALS
@ PLUSEQUALS
Definition Tokens.h:188
openvdb::v12_1::ax::ast::tokens::EQUALSEQUALS
@ EQUALSEQUALS
RELATIONAL.
Definition Tokens.h:169
openvdb::v12_1::ax::ast::tokens::BITXOR
@ BITXOR
Definition Tokens.h:182
openvdb::v12_1::ax::ast::tokens::BITAND
@ BITAND
Definition Tokens.h:180
openvdb::v12_1::ax::ast::tokens::AND
@ AND
LOGICAL.
Definition Tokens.h:163
openvdb::v12_1::ax::ast::tokens::PLUS
@ PLUS
ARITHMETIC.
Definition Tokens.h:155
openvdb::v12_1::ax::ast::tokens::LESSTHAN
@ LESSTHAN
Definition Tokens.h:172
openvdb::v12_1::ax::ast::tokens::DIVIDEEQUALS
@ DIVIDEEQUALS
Definition Tokens.h:191
openvdb::v12_1::ax::ast::tokens::EQUALS
@ EQUALS
ASSIGNMENT.
Definition Tokens.h:187
openvdb::v12_1::ax::ast::tokens::OR
@ OR
Definition Tokens.h:164
openvdb::v12_1::ax::ast::tokens::MODULO
@ MODULO
Definition Tokens.h:159
openvdb::v12_1::ax::ast::tokens::MORETHAN
@ MORETHAN
Definition Tokens.h:171
openvdb::v12_1::ax::ast::tokens::MULTIPLYEQUALS
@ MULTIPLYEQUALS
Definition Tokens.h:190
openvdb::v12_1::ax::ast::tokens::BITANDEQUALS
@ BITANDEQUALS
Definition Tokens.h:195
openvdb::v12_1::ax::ast::tokens::NOTEQUALS
@ NOTEQUALS
Definition Tokens.h:170
openvdb::v12_1::ax::ast::tokens::SHIFTRIGHTEQUALS
@ SHIFTRIGHTEQUALS
Definition Tokens.h:194
openvdb::v12_1::ax::ast::tokens::MULTIPLY
@ MULTIPLY
Definition Tokens.h:157
openvdb::v12_1::ax::ast::tokens::SHIFTLEFT
@ SHIFTLEFT
BITWISE.
Definition Tokens.h:178
openvdb::v12_1::ax::ast::tokens::MINUS
@ MINUS
Definition Tokens.h:156
openvdb::v12_1::ax::ast::tokens::typeStringFromToken
std::string typeStringFromToken(const CoreType type)
Definition Tokens.h:118
openvdb::v12_1::ax::ast::tokens::loopNameFromToken
std::string loopNameFromToken(const LoopToken loop)
Definition Tokens.h:303
openvdb::v12_1::ax::ast::tokens::operatorTokenFromName
OperatorToken operatorTokenFromName(const std::string &name)
Definition Tokens.h:221
openvdb::v12_1::ax::ast::tokens::operatorType
OperatorType operatorType(const OperatorToken token)
Definition Tokens.h:210
openvdb::v12_1::ax::ast::tokens::KeywordToken
KeywordToken
Definition Tokens.h:315
openvdb::v12_1::ax::ast::tokens::CONTINUE
@ CONTINUE
Definition Tokens.h:318
openvdb::v12_1::ax::ast::tokens::RETURN
@ RETURN
Definition Tokens.h:316
openvdb::v12_1::ax::ast::tokens::BREAK
@ BREAK
Definition Tokens.h:317
openvdb::v12_1::ax::ast::tokens::OperatorType
OperatorType
Definition Tokens.h:201
openvdb::v12_1::ax::ast::tokens::ASSIGNMENT
@ ASSIGNMENT
Definition Tokens.h:206
openvdb::v12_1::ax::ast::tokens::LOGICAL
@ LOGICAL
Definition Tokens.h:203
openvdb::v12_1::ax::ast::tokens::BITWISE
@ BITWISE
Definition Tokens.h:205
openvdb::v12_1::ax::ast::tokens::ARITHMETIC
@ ARITHMETIC
Definition Tokens.h:202
openvdb::v12_1::ax::ast::tokens::RELATIONAL
@ RELATIONAL
Definition Tokens.h:204
openvdb::v12_1::ax::ast::tokens::UNKNOWN_OPERATOR
@ UNKNOWN_OPERATOR
Definition Tokens.h:207
openvdb::v12_1::ax::ast::tokens::LoopToken
LoopToken
Definition Tokens.h:297
openvdb::v12_1::ax::ast::tokens::WHILE
@ WHILE
Definition Tokens.h:300
openvdb::v12_1::ax::ast::tokens::FOR
@ FOR
Definition Tokens.h:298
openvdb::v12_1::ax::ast::tokens::DO
@ DO
Definition Tokens.h:299
openvdb::v12_1::ax::ast::tokens::tokenFromTypeString
CoreType tokenFromTypeString(const std::string &type)
Definition Tokens.h:66
openvdb::v12_1::ax::ast::tokens::keywordNameFromToken
std::string keywordNameFromToken(const KeywordToken keyw)
Definition Tokens.h:321
openvdb::v12_1::ax::ast::tokens::CoreType
CoreType
Definition Tokens.h:32
openvdb::v12_1::ax::ast::tokens::VEC3D
@ VEC3D
Definition Tokens.h:47
openvdb::v12_1::ax::ast::tokens::MAT3F
@ MAT3F
Definition Tokens.h:53
openvdb::v12_1::ax::ast::tokens::MAT3D
@ MAT3D
Definition Tokens.h:54
openvdb::v12_1::ax::ast::tokens::MAT4D
@ MAT4D
Definition Tokens.h:57
openvdb::v12_1::ax::ast::tokens::DOUBLE
@ DOUBLE
Definition Tokens.h:39
openvdb::v12_1::ax::ast::tokens::INT64
@ INT64
Definition Tokens.h:37
openvdb::v12_1::ax::ast::tokens::CHAR
@ CHAR
Definition Tokens.h:34
openvdb::v12_1::ax::ast::tokens::VEC3F
@ VEC3F
Definition Tokens.h:46
openvdb::v12_1::ax::ast::tokens::VEC2I
@ VEC2I
Definition Tokens.h:41
openvdb::v12_1::ax::ast::tokens::UNKNOWN
@ UNKNOWN
Definition Tokens.h:63
openvdb::v12_1::ax::ast::tokens::MAT4F
@ MAT4F
Definition Tokens.h:56
openvdb::v12_1::ax::ast::tokens::VEC4F
@ VEC4F
Definition Tokens.h:50
openvdb::v12_1::ax::ast::tokens::VEC4I
@ VEC4I
Definition Tokens.h:49
openvdb::v12_1::ax::ast::tokens::FLOAT
@ FLOAT
Definition Tokens.h:38
openvdb::v12_1::ax::ast::tokens::VEC2D
@ VEC2D
Definition Tokens.h:43
openvdb::v12_1::ax::ast::tokens::VEC3I
@ VEC3I
Definition Tokens.h:45
openvdb::v12_1::ax::ast::tokens::VEC4D
@ VEC4D
Definition Tokens.h:51
openvdb::v12_1::ax::ast::tokens::INT32
@ INT32
Definition Tokens.h:36
openvdb::v12_1::ax::ast::tokens::INT16
@ INT16
Definition Tokens.h:35
openvdb::v12_1::ax::ast::tokens::QUATF
@ QUATF
Definition Tokens.h:59
openvdb::v12_1::ax::ast::tokens::QUATD
@ QUATD
Definition Tokens.h:60
openvdb::v12_1::ax::ast::tokens::BOOL
@ BOOL
Definition Tokens.h:33
openvdb::v12_1::ax::ast::tokens::VEC2F
@ VEC2F
Definition Tokens.h:42
openvdb::v12_1::ax::ast::tokens::STRING
@ STRING
Definition Tokens.h:62
openvdb
Definition Exceptions.h:13
OPENVDB_THROW
#define OPENVDB_THROW(exception, message)
Definition Exceptions.h:74
Types.h
OPENVDB_VERSION_NAME
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
OPENVDB_USE_VERSION_NAMESPACE
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:218