11 #ifndef ONCE_FPARSER_H_ 12 #define ONCE_FPARSER_H_ 17 #ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING 24 #pragma warning(disable : 4661) 29 template<
typename Value_t>
35 SYNTAX_ERROR=0, MISM_PARENTH, MISSING_PARENTH, EMPTY_PARENTH,
46 int Parse(
const char* Function,
const std::string& Vars,
47 bool useDegrees =
false);
48 int Parse(
const std::string& Function,
const std::string& Vars,
49 bool useDegrees =
false);
51 void setDelimiterChar(
char);
53 static Value_t epsilon();
54 static void setEpsilon(Value_t);
56 const char* ErrorMsg()
const;
59 Value_t Eval(
const Value_t* Vars);
60 int EvalError()
const;
62 bool AddConstant(
const std::string& name, Value_t value);
63 bool AddUnit(
const std::string& name, Value_t value);
65 typedef Value_t (*FunctionPtr)(
const Value_t*);
67 bool AddFunction(
const std::string& name,
68 FunctionPtr,
unsigned paramsAmount);
71 class FunctionWrapper;
73 template<
typename DerivedWrapper>
74 bool AddFunctionWrapper(
const std::string& name,
const DerivedWrapper&,
75 unsigned paramsAmount);
77 FunctionWrapper* GetFunctionWrapper(
const std::string& name);
79 bool RemoveIdentifier(
const std::string& name);
84 int ParseAndDeduceVariables(
const std::string&
function,
85 int* amountOfVariablesFound = 0,
86 bool useDegrees =
false);
87 int ParseAndDeduceVariables(
const std::string&
function,
88 std::string& resultVarString,
89 int* amountOfVariablesFound = 0,
90 bool useDegrees =
false);
91 int ParseAndDeduceVariables(
const std::string&
function,
92 std::vector<std::string>& resultVars,
93 bool useDegrees =
false);
105 void ForceDeepCopy();
109 #ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING 113 void InjectRawByteCode(
const unsigned* bytecode,
unsigned bytecodeAmount,
114 const Value_t* immed,
unsigned immedAmount,
117 void PrintByteCode(std::ostream& dest,
bool showExpression =
true)
const;
128 Data* getParserData();
147 bool NameExists(
const char*,
unsigned);
148 bool ParseVariables(
const std::string&);
149 int ParseFunction(
const char*,
bool);
152 void AddFunctionOpcode(
unsigned);
153 void AddImmedOpcode(Value_t v);
155 void CompilePowi(
long);
156 bool TryCompilePowi(Value_t);
158 const char* CompileIf(
const char*);
159 const char* CompileFunctionParams(
const char*,
unsigned);
160 const char* CompileElement(
const char*);
161 const char* CompilePossibleUnit(
const char*);
162 const char* CompilePow(
const char*);
163 const char* CompileUnaryMinus(
const char*);
164 const char* CompileMult(
const char*);
165 const char* CompileAddition(
const char*);
166 const char* CompileComparison(
const char*);
167 const char* CompileAnd(
const char*);
168 const char* CompileExpression(
const char*);
169 inline const char* CompileFunction(
const char*,
unsigned);
170 inline const char* CompileParenthesis(
const char*);
171 inline const char* CompileLiteral(
const char*);
172 template<
bool SetFlag>
173 inline void PushOpcodeParam(
unsigned);
174 template<
bool SetFlag>
175 inline void PutOpcodeParamAt(
unsigned,
unsigned offset);
176 const char* Compile(
const char*);
178 bool addFunctionWrapperPtr(
const std::string&,
FunctionWrapper*,
unsigned);
184 static std::pair<const char*, Value_t> ParseLiteral(
const char*);
185 static unsigned ParseIdentifier(
const char*);
200 template<
typename Value_t>
203 unsigned mReferenceCount;
212 virtual Value_t callFunction(
const Value_t*) = 0;
215 template<
typename Value_t>
216 template<
typename DerivedWrapper>
218 (
const std::string& name,
const DerivedWrapper& wrapper,
unsigned paramsAmount)
220 return addFunctionWrapperPtr
221 (name,
new DerivedWrapper(wrapper), paramsAmount);
FunctionWrapper & operator=(const FunctionWrapper &)
FunctionWrapper(const FunctionWrapper &)
bool AddFunctionWrapper(const std::string &name, const DerivedWrapper &, unsigned paramsAmount)
virtual ~FunctionWrapper()