KSeExpr  4.0.4.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 
22 namespace llvm {
23 class ExecutionEngine;
24 class LLVMContext;
25 }
26 
27 namespace KSeExpr {
28 
29 class ExprNode;
30 class ExprVarNode;
31 class ExprFunc;
32 class Expression;
33 class Interpreter;
34 
36 class ExprVarRef {
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 
62 class LLVMEvaluator;
63 class VarBlock;
64 class VarBlockCreator;
65 
67 class Expression {
68  public:
72  UseLLVM
73  };
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 
90  int startPos;
91 
93  int endPos;
94 
95  Error(const ErrorCode errorIn, std::vector<std::string> idsIn, const int startPosIn, const int endPosIn)
96  : error(errorIn), ids(idsIn), startPos(startPosIn), endPos(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 
253  bool _wantVec;
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.
Definition: Expression.cpp:283
ErrorCode _parseErrorCode
Definition: Expression.h:287
virtual ExprVarRef * resolveVar(const std::string &) const
Definition: Expression.h:201
void setExpr(const std::string &e)
Definition: Expression.cpp:134
bool syntaxOK() const
Definition: Expression.cpp:139
const std::vector< std::string > & getThreadUnsafeFunctionCalls() const
Definition: Expression.h:171
const std::vector< std::pair< int, int > > & getComments() const
Definition: Expression.h:149
static bool debugging
Whether to debug expressions.
Definition: Expression.h:77
std::set< std::string > _vars
Definition: Expression.h:299
bool usesFunc(const std::string &name) const
Definition: Expression.cpp:154
const Context * _context
Definition: Expression.h:264
void parse() const
Definition: Expression.cpp:159
bool isConstant() const
Definition: Expression.cpp:144
void parseIfNeeded() const
Definition: Expression.h:244
virtual ExprFunc * resolveFunc(const std::string &) const
Definition: Expression.h:204
void addComment(int pos, int length)
Definition: Expression.h:212
void setThreadUnsafe(const std::string &functionName) const
Definition: Expression.h:168
void prep() const
Definition: Expression.cpp:169
const std::string & getExpr() const
Get the string that this expression is currently set to evaluate.
Definition: Expression.h:116
EvaluationStrategy _evaluationStrategy
Definition: Expression.h:261
Expression(EvaluationStrategy be=Expression::defaultEvaluationStrategy)
Definition: Expression.cpp:54
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
Definition: Expression.cpp:149
Expression & operator=(const Expression &e)
ExprNode * _parseTree
Definition: Expression.h:273
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
Definition: Expression.cpp:269
bool isValid() const
Definition: Expression.h:127
void prepIfNeeded() const
Definition: Expression.h:276
ExprType _returnType
Definition: Expression.h:256
bool isVec() const
Definition: Expression.cpp:259
const std::vector< std::string > & parseErrorArgs() const
Definition: Expression.h:142
bool wantVec() const
Definition: Expression.h:174
EvaluationStrategy
Types of evaluation strategies that are available.
Definition: Expression.h:70
void debugPrintParseTree() const
Definition: Expression.cpp:85
void setContext(const Context &context)
Definition: Expression.cpp:119
const std::vector< Error > & getErrors() const
Definition: Expression.h:146
ExprVarEnvBuilder _envBuilder
Definition: Expression.h:271
void debugPrintInterpreter() const
Definition: Expression.cpp:76
virtual ~Expression()
Definition: Expression.cpp:71
const ExprType & returnType() const
Definition: Expression.cpp:264
std::vector< std::pair< int, int > > _comments
Definition: Expression.h:296
const ErrorCode & parseError() const
Definition: Expression.h:134
const VarBlockCreator * varBlockCreator() const
Definition: Expression.h:233
const Context & context() const
Definition: Expression.h:218
const char * evalStr(VarBlock *varBlock=nullptr) const
Definition: Expression.cpp:304
std::vector< Error > _errors
Definition: Expression.h:293
void setVarBlockCreator(const VarBlockCreator *varBlockCreator)
Definition: Expression.cpp:129
ExprType _desiredReturnType
Definition: Expression.h:268
std::vector< std::string > _threadUnsafeFunctionCalls
Definition: Expression.h:308
void setDesiredReturnType(const ExprType &type)
Definition: Expression.cpp:124
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
Definition: Expression.cpp:83
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)
ErrorCode
Definition: ErrorCode.h:7
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