KSeExpr 6.0.0.0
Expression.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2011-2019 Disney Enterprises, Inc.
2// SPDX-License-Identifier: LicenseRef-Apache-2.0
3// SPDX-FileCopyrightText: 2020 L. E. Segovia <amy@amyspark.me>
4// SPDX-License-Identifier: GPL-3.0-or-later
5
6#ifndef Expression_h
7#define Expression_h
8
9#include <string>
10#include <map>
11#include <set>
12#include <vector>
13#include <iomanip>
14#include <stdint.h>
15
16#include "Context.h"
17#include "ErrorCode.h"
18#include "ExprConfig.h"
19#include "ExprEnv.h"
20#include "Vec.h"
21
22namespace llvm {
23class ExecutionEngine;
24class LLVMContext;
25}
26
27namespace KSeExpr {
28
29class ExprNode;
30class ExprVarNode;
31class ExprFunc;
32class Expression;
33class Interpreter;
34
37 ExprVarRef() : _type(ExprType().Error().Varying()) {};
38
39 public:
41
42 virtual ~ExprVarRef() {}
43
45 virtual void setType(const ExprType& type) {
46 _type = type;
47 };
48
50 virtual ExprType type() const {
51 return _type;
52 };
53
55 virtual void eval(double* result) = 0;
56 virtual void eval(const char** resultStr) = 0;
57
58 private:
60};
61
62class LLVMEvaluator;
63class VarBlock;
64class VarBlockCreator;
65
68 public:
77 static bool debugging;
78
79 // typedef std::map<std::string, ExprLocalVarRef> LocalVarTable;
80
82 struct Error {
85
87 std::vector<std::string> ids;
88
91
93 int endPos;
94
95 Error(const ErrorCode errorIn, std::vector<std::string> idsIn, const int startPosIn, const int endPosIn)
97 };
98
100 Expression(const std::string& e,
101 const ExprType& type = ExprType().FP(3),
103 const Context& context = Context::global());
104
105 virtual ~Expression();
106
109 void setDesiredReturnType(const ExprType& type);
110
113 void setExpr(const std::string& e);
114
116 const std::string& getExpr() const { return _expression; }
117
121 bool syntaxOK() const;
122
127 bool isValid() const {
128 prepIfNeeded();
129 return _isValid;
130 }
131
134 const ErrorCode& parseError() const { return _parseErrorCode; }
135
142 const std::vector<std::string>& parseErrorArgs() const { return _parseErrorIds; }
143
146 const std::vector<Error>& getErrors() const { return _errors; }
147
149 const std::vector<std::pair<int, int> >& getComments() const { return _comments; }
150
153 bool isConstant() const;
154
157 bool usesVar(const std::string& name) const;
158
161 bool usesFunc(const std::string& name) const;
162
164 bool isThreadSafe() const { return _threadUnsafeFunctionCalls.size() == 0; }
165
168 void setThreadUnsafe(const std::string& functionName) const { _threadUnsafeFunctionCalls.push_back(functionName); }
169
171 const std::vector<std::string>& getThreadUnsafeFunctionCalls() const { return _threadUnsafeFunctionCalls; }
172
174 bool wantVec() const { return _wantVec; }
175
179 bool isVec() const;
180
184 const ExprType& returnType() const;
185
187 void evalMultiple(VarBlock* varBlock, int outputVarBlockOffset, size_t rangeStart, size_t rangeEnd) const;
188
189 // TODO: make this deprecated
191 const double* evalFP(VarBlock* varBlock = nullptr) const;
192
193 // TODO: make this deprecated
195 const char* evalStr(VarBlock* varBlock = nullptr) const;
196
198 void reset();
199
201 virtual ExprVarRef* resolveVar(const std::string&) const { return 0; }
202
204 virtual ExprFunc* resolveFunc(const std::string&) const { return 0; }
205
207 void addError(const ErrorCode error, const std::vector<std::string> ids, const int startPos, const int endPos) const {
208 _errors.push_back(Error(error, ids, startPos, endPos));
209 }
210
212 void addComment(int pos, int length) { _comments.push_back(std::pair<int, int>(pos, length + pos - 1)); }
213
215 // const LocalVarTable& getLocalVars() const {return _localVars;}
216
218 const Context& context() const { return *_context; }
219 void setContext(const Context& context);
220
222 void debugPrintParseTree() const;
223
225 void debugPrintInterpreter() const;
226
228 void debugPrintLLVM() const;
229
232
234
235 private:
239
241 void parse() const;
242
244 void parseIfNeeded() const {
245 if (!_parsed) parse();
246 }
247
250 void prep() const;
251
254
257
259 std::string _expression;
260
262
265
266 protected:
269
274
276 void prepIfNeeded() const {
277 if (!_prepped) prep();
278 }
279
280 private:
282 mutable bool _isValid;
284 mutable bool _parsed, _prepped;
285
288
290 mutable std::vector<std::string> _parseErrorIds;
291
293 mutable std::vector<Error> _errors;
294
296 mutable std::vector<std::pair<int, int> > _comments;
297
299 mutable std::set<std::string> _vars;
300
302 mutable std::set<std::string> _funcs;
303
305 // mutable LocalVarTable _localVars;
306
308 mutable std::vector<std::string> _threadUnsafeFunctionCalls;
309
312 mutable int _returnSlot;
313
314 // LLVM evaluation layer
316
317 // Var block creator
319
320 /* internal */ public:
321
323 void addVar(const char* n) const { _vars.insert(n); }
324
326 void addFunc(const char* n) const { _funcs.insert(n); }
327
329 // ExprVarRef* resolveLocalVar(const char* n) const {
330 // LocalVarTable::iterator iter = _localVars.find(n);
331 // if (iter != _localVars.end()) return &iter->second;
332 // return 0;
333 //}
334
337 /* ExprLocalVarRef* getLocalVar(const char* n) const { */
338 /* return &_localVars[n]; */
339 /* } */
340};
341}
342
343#endif
static Context & global()
The global default context of the seexpr.
Definition Context.cpp:25
Function Definition, used in parse tree and func table.
Definition ExprFunc.h:35
Variable scope builder is used by the type checking and code gen to track visiblity of variables and ...
Definition ExprEnv.h:181
abstract class for implementing variable references
Definition Expression.h:36
virtual ExprType type() const
returns (current) type
Definition Expression.h:50
virtual void setType(const ExprType &type)
sets (current) type to given type
Definition Expression.h:45
ExprVarRef(const ExprType &type)
Definition Expression.h:40
virtual void eval(double *result)=0
returns this variable's value by setting result
virtual void eval(const char **resultStr)=0
virtual ~ExprVarRef()
Definition Expression.h:42
main expression class
Definition Expression.h:67
const VarBlockCreator * _varBlockCreator
Definition Expression.h:318
void evalMultiple(VarBlock *varBlock, int outputVarBlockOffset, size_t rangeStart, size_t rangeEnd) const
Evaluate multiple blocks.
ErrorCode _parseErrorCode
Definition Expression.h:287
void setExpr(const std::string &e)
bool syntaxOK() const
static bool debugging
Whether to debug expressions.
Definition Expression.h:77
std::set< std::string > _vars
Definition Expression.h:299
const std::string & getExpr() const
Get the string that this expression is currently set to evaluate.
Definition Expression.h:116
bool usesFunc(const std::string &name) const
const Context * _context
Definition Expression.h:264
bool isConstant() const
void parseIfNeeded() const
Definition Expression.h:244
void addComment(int pos, int length)
Definition Expression.h:212
void setThreadUnsafe(const std::string &functionName) const
Definition Expression.h:168
const std::vector< std::pair< int, int > > & getComments() const
Definition Expression.h:149
EvaluationStrategy _evaluationStrategy
Definition Expression.h:261
void addError(const ErrorCode error, const std::vector< std::string > ids, const int startPos, const int endPos) const
Definition Expression.h:207
std::set< std::string > _funcs
Definition Expression.h:302
bool usesVar(const std::string &name) const
const VarBlockCreator * varBlockCreator() const
Definition Expression.h:233
virtual ExprVarRef * resolveVar(const std::string &) const
Definition Expression.h:201
ExprNode * _parseTree
Definition Expression.h:273
virtual ExprFunc * resolveFunc(const std::string &) const
Definition Expression.h:204
void addFunc(const char *n) const
add function evaluation (this is for internal use)
Definition Expression.h:326
Expression(const Expression &e)
bool isThreadSafe() const
Definition Expression.h:164
Interpreter * _interpreter
Definition Expression.h:311
std::vector< std::string > _parseErrorIds
Definition Expression.h:290
const double * evalFP(VarBlock *varBlock=nullptr) const
bool isValid() const
Definition Expression.h:127
void prepIfNeeded() const
Definition Expression.h:276
Expression & operator=(const Expression &e)
bool wantVec() const
Definition Expression.h:174
EvaluationStrategy
Types of evaluation strategies that are available.
Definition Expression.h:70
void debugPrintParseTree() const
void setContext(const Context &context)
const std::vector< Error > & getErrors() const
Definition Expression.h:146
ExprVarEnvBuilder _envBuilder
Definition Expression.h:271
void debugPrintInterpreter() const
const ExprType & returnType() const
std::vector< std::pair< int, int > > _comments
Definition Expression.h:296
const Context & context() const
Definition Expression.h:218
const ErrorCode & parseError() const
Definition Expression.h:134
const std::vector< std::string > & getThreadUnsafeFunctionCalls() const
Definition Expression.h:171
const char * evalStr(VarBlock *varBlock=nullptr) const
std::vector< Error > _errors
Definition Expression.h:293
void setVarBlockCreator(const VarBlockCreator *varBlockCreator)
ExprType _desiredReturnType
Definition Expression.h:268
const std::vector< std::string > & parseErrorArgs() const
Definition Expression.h:142
std::vector< std::string > _threadUnsafeFunctionCalls
Definition Expression.h:308
void setDesiredReturnType(const ExprType &type)
void addVar(const char *n) const
add local variable (this is for internal use)
Definition Expression.h:323
static EvaluationStrategy defaultEvaluationStrategy
What evaluation strategy to use by default.
Definition Expression.h:75
std::string _expression
Definition Expression.h:259
void debugPrintLLVM() const
LLVMEvaluator * _llvmEvaluator
Definition Expression.h:315
A class that lets you register for the variables used by one or more expressions.
Definition VarBlock.h:90
A thread local evaluation context. Just allocate and fill in with data.
Definition VarBlock.h:22
double length(const Vec3d &v)
Represents a parse or type checking error in an expression.
Definition Expression.h:82
int startPos
Error start offset in expression string.
Definition Expression.h:90
int endPos
Error end offset in expression string.
Definition Expression.h:93
Error(const ErrorCode errorIn, std::vector< std::string > idsIn, const int startPosIn, const int endPosIn)
Definition Expression.h:95
ErrorCode error
Error code (index to be translated)
Definition Expression.h:84
std::vector< std::string > ids
Arguments to the error (to be inserted into the translation)
Definition Expression.h:87