SeExpr
Expression.h
Go to the documentation of this file.
1/*
2 Copyright Disney Enterprises, Inc. All rights reserved.
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License
6 and the following modification to it: Section 6 Trademarks.
7 deleted and replaced with:
8
9 6. Trademarks. This License does not grant permission to use the
10 trade names, trademarks, service marks, or product names of the
11 Licensor and its affiliates, except as required for reproducing
12 the content of the NOTICE file.
13
14 You may obtain a copy of the License at
15 http://www.apache.org/licenses/LICENSE-2.0
16*/
17#ifndef Expression_h
18#define Expression_h
19
20#include <string>
21#include <map>
22#include <set>
23#include <vector>
24#include <iomanip>
25#include <stdint.h>
26#include "ExprConfig.h"
27#include "Vec.h"
28#include "Context.h"
29#include "ExprEnv.h"
30
31namespace llvm {
32class ExecutionEngine;
33class LLVMContext;
34}
35
36namespace SeExpr2 {
37
38class ExprNode;
39class ExprVarNode;
40class ExprFunc;
41class Expression;
42class Interpreter;
43
46 ExprVarRef() : _type(ExprType().Error().Varying()) {};
47
48 public:
50
51 virtual ~ExprVarRef() {}
52
54 virtual void setType(const ExprType& type) {
55 _type = type;
56 };
57
59 virtual ExprType type() const {
60 return _type;
61 };
62
64 virtual void eval(double* result) = 0;
65 virtual void eval(const char** resultStr) = 0;
66
67 private:
69};
70
71class LLVMEvaluator;
72class VarBlock;
73class VarBlockCreator;
74
77 public:
82 };
86 static bool debugging;
87
88 // typedef std::map<std::string, ExprLocalVarRef> LocalVarTable;
89
91 struct Error {
93 std::string error;
94
97
99 int endPos;
100
101 Error(const std::string& errorIn, const int startPosIn, const int endPosIn)
102 : error(errorIn), startPos(startPosIn), endPos(endPosIn) {}
103 };
104
106 Expression(const std::string& e,
107 const ExprType& type = ExprType().FP(3),
109 const Context& context = Context::global());
110
111 virtual ~Expression();
112
115 void setDesiredReturnType(const ExprType& type);
116
119 void setExpr(const std::string& e);
120
122 const std::string& getExpr() const { return _expression; }
123
127 bool syntaxOK() const;
128
133 bool isValid() const {
134 prepIfNeeded();
135 return _isValid;
136 }
137
140 const std::string& parseError() const { return _parseError; }
141
144 const std::vector<Error>& getErrors() const { return _errors; }
145
147 const std::vector<std::pair<int, int> >& getComments() const { return _comments; }
148
151 bool isConstant() const;
152
155 bool usesVar(const std::string& name) const;
156
159 bool usesFunc(const std::string& name) const;
160
162 bool isThreadSafe() const { return _threadUnsafeFunctionCalls.size() == 0; }
163
166 void setThreadUnsafe(const std::string& functionName) const { _threadUnsafeFunctionCalls.push_back(functionName); }
167
169 const std::vector<std::string>& getThreadUnsafeFunctionCalls() const { return _threadUnsafeFunctionCalls; }
170
172 bool wantVec() const { return _wantVec; }
173
177 bool isVec() const;
178
182 const ExprType& returnType() const;
183
185 void evalMultiple(VarBlock* varBlock, int outputVarBlockOffset, size_t rangeStart, size_t rangeEnd) const;
186
187 // TODO: make this deprecated
189 const double* evalFP(VarBlock* varBlock = nullptr) const;
190
191 // TODO: make this deprecated
193 const char* evalStr(VarBlock* varBlock = nullptr) const;
194
196 void reset();
197
199 virtual ExprVarRef* resolveVar(const std::string& name) const { return 0; }
200
202 virtual ExprFunc* resolveFunc(const std::string& name) const { return 0; }
203
205 void addError(const std::string& error, const int startPos, const int endPos) const {
206 _errors.push_back(Error(error, startPos, endPos));
207 }
208
210 void addComment(int pos, int length) { _comments.push_back(std::pair<int, int>(pos, length + pos - 1)); }
211
213 // const LocalVarTable& getLocalVars() const {return _localVars;}
214
216 const Context& context() const { return *_context; }
217 void setContext(const Context& context);
218
220 void debugPrintParseTree() const;
221
223 void debugPrintInterpreter() const;
224
226 void debugPrintLLVM() const;
227
230
232
233 private:
237
239 void parse() const;
240
242 void parseIfNeeded() const {
243 if (!_parsed) parse();
244 }
245
248 void prep() const;
249
252
255
257 std::string _expression;
258
260
263
264 protected:
267
272
274 void prepIfNeeded() const {
275 if (!_prepped) prep();
276 }
277
278 private:
280 mutable bool _isValid;
282 mutable bool _parsed, _prepped;
283
285 mutable std::string _parseError;
286
288 mutable std::vector<Error> _errors;
289
291 mutable std::vector<std::pair<int, int> > _comments;
292
294 mutable std::set<std::string> _vars;
295
297 mutable std::set<std::string> _funcs;
298
300 // mutable LocalVarTable _localVars;
301
303 mutable std::vector<std::string> _threadUnsafeFunctionCalls;
304
307 mutable int _returnSlot;
308
309 // LLVM evaluation layer
311
312 // Var block creator
314
315 /* internal */ public:
316
318 void addVar(const char* n) const { _vars.insert(n); }
319
321 void addFunc(const char* n) const { _funcs.insert(n); }
322
324 // ExprVarRef* resolveLocalVar(const char* n) const {
325 // LocalVarTable::iterator iter = _localVars.find(n);
326 // if (iter != _localVars.end()) return &iter->second;
327 // return 0;
328 //}
329
332 /* ExprLocalVarRef* getLocalVar(const char* n) const { */
333 /* return &_localVars[n]; */
334 /* } */
335};
336}
337
338#endif
static Context & global()
The global default context of the seexpr.
Definition: Context.cpp:29
Function Definition, used in parse tree and func table.
Definition: ExprFunc.h:44
Variable scope builder is used by the type checking and code gen to track visiblity of variables and ...
Definition: ExprEnv.h:148
abstract class for implementing variable references
Definition: Expression.h:45
virtual void eval(double *result)=0
returns this variable's value by setting result
ExprVarRef(const ExprType &type)
Definition: Expression.h:49
virtual ExprType type() const
returns (current) type
Definition: Expression.h:59
virtual ~ExprVarRef()
Definition: Expression.h:51
virtual void setType(const ExprType &type)
sets (current) type to given type
Definition: Expression.h:54
virtual void eval(const char **resultStr)=0
main expression class
Definition: Expression.h:76
void addComment(int pos, int length)
Definition: Expression.h:210
bool isVec() const
Definition: Expression.cpp:294
void parseIfNeeded() const
Definition: Expression.h:242
bool usesVar(const std::string &name) const
Definition: Expression.cpp:184
const Context & context() const
Definition: Expression.h:216
void setDesiredReturnType(const ExprType &type)
Definition: Expression.cpp:159
ExprType _returnType
Definition: Expression.h:254
virtual ExprVarRef * resolveVar(const std::string &name) const
Definition: Expression.h:199
Interpreter * _interpreter
Definition: Expression.h:306
const std::vector< std::string > & getThreadUnsafeFunctionCalls() const
Definition: Expression.h:169
const VarBlockCreator * _varBlockCreator
Definition: Expression.h:313
std::vector< std::pair< int, int > > _comments
Definition: Expression.h:291
const std::vector< std::pair< int, int > > & getComments() const
Definition: Expression.h:147
EvaluationStrategy
Types of evaluation strategies that are available.
Definition: Expression.h:79
Expression(EvaluationStrategy be=Expression::defaultEvaluationStrategy)
Definition: Expression.cpp:90
std::vector< Error > _errors
Definition: Expression.h:288
const char * evalStr(VarBlock *varBlock=nullptr) const
Definition: Expression.cpp:339
std::set< std::string > _funcs
Definition: Expression.h:297
EvaluationStrategy _evaluationStrategy
Definition: Expression.h:259
const ExprType & returnType() const
Definition: Expression.cpp:299
const std::string & getExpr() const
Get the string that this expression is currently set to evaluate.
Definition: Expression.h:122
void setExpr(const std::string &e)
Definition: Expression.cpp:169
void addError(const std::string &error, const int startPos, const int endPos) const
Definition: Expression.h:205
void prep() const
Definition: Expression.cpp:204
LLVMEvaluator * _llvmEvaluator
Definition: Expression.h:310
Expression & operator=(const Expression &e)
bool usesFunc(const std::string &name) const
Definition: Expression.cpp:189
void addFunc(const char *n) const
add function evaluation (this is for internal use)
Definition: Expression.h:321
std::set< std::string > _vars
Definition: Expression.h:294
const VarBlockCreator * varBlockCreator() const
Definition: Expression.h:231
bool syntaxOK() const
Definition: Expression.cpp:174
bool isConstant() const
Definition: Expression.cpp:179
void setVarBlockCreator(const VarBlockCreator *varBlockCreator)
Definition: Expression.cpp:164
void evalMultiple(VarBlock *varBlock, int outputVarBlockOffset, size_t rangeStart, size_t rangeEnd) const
Evaluate multiple blocks.
Definition: Expression.cpp:318
virtual ExprFunc * resolveFunc(const std::string &name) const
Definition: Expression.h:202
const double * evalFP(VarBlock *varBlock=nullptr) const
Definition: Expression.cpp:304
void debugPrintLLVM() const
Definition: Expression.cpp:119
const std::string & parseError() const
Definition: Expression.h:140
bool isValid() const
Definition: Expression.h:133
std::string _parseError
Definition: Expression.h:285
const Context * _context
Definition: Expression.h:262
const std::vector< Error > & getErrors() const
Definition: Expression.h:144
ExprNode * _parseTree
Definition: Expression.h:271
Expression(const Expression &e)
std::string _expression
Definition: Expression.h:257
void setThreadUnsafe(const std::string &functionName) const
Definition: Expression.h:166
void setContext(const Context &context)
Definition: Expression.cpp:154
ExprType _desiredReturnType
Definition: Expression.h:266
static EvaluationStrategy defaultEvaluationStrategy
What evaluation strategy to use by default.
Definition: Expression.h:84
void debugPrintInterpreter() const
Definition: Expression.cpp:112
static bool debugging
Whether to debug expressions.
Definition: Expression.h:86
void prepIfNeeded() const
Definition: Expression.h:274
bool isThreadSafe() const
Definition: Expression.h:162
std::vector< std::string > _threadUnsafeFunctionCalls
Definition: Expression.h:303
void debugPrintParseTree() const
Definition: Expression.cpp:121
bool wantVec() const
Definition: Expression.h:172
void parse() const
Definition: Expression.cpp:194
ExprVarEnvBuilder _envBuilder
Definition: Expression.h:269
void addVar(const char *n) const
add local variable (this is for internal use)
Definition: Expression.h:318
A class that lets you register for the variables used by one or more expressions.
Definition: VarBlock.h:84
A thread local evaluation context. Just allocate and fill in with data.
Definition: VarBlock.h:33
double length(const Vec3d &v)
Represents a parse or type checking error in an expression.
Definition: Expression.h:91
int endPos
Error end offset in expression string.
Definition: Expression.h:99
int startPos
Error start offset in expression string.
Definition: Expression.h:96
std::string error
Text of error.
Definition: Expression.h:93
Error(const std::string &errorIn, const int startPosIn, const int endPosIn)
Definition: Expression.h:101
< b ></b >< br >< b ></b ></td >< td > vector constructor< br > vector component access n must be
Definition: userdoc.txt:484