34 #define FP_NO_SUPPORT_OPTIMIZER
46 #ifndef ONCE_FPARSER_H_
47 #define ONCE_FPARSER_H_
52 #ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
59 #pragma warning(disable : 4661)
62 namespace FPoptimizer_CodeTree {
template<
typename Value_t>
class CodeTree; }
64 template<
typename Value_t>
65 class FunctionParserBase
70 SYNTAX_ERROR=0, MISM_PARENTH, MISSING_PARENTH, EMPTY_PARENTH,
71 EXPECT_OPERATOR, OUT_OF_MEMORY, UNEXPECTED_ERROR, INVALID_VARS,
72 ILL_PARAMS_AMOUNT, PREMATURE_EOS, EXPECT_PARENTH_FUNC,
74 NO_FUNCTION_PARSED_YET,
78 typedef Value_t value_type;
80 int Parse(
const char* Function,
const std::string& Vars,
81 bool useDegrees =
false);
82 int Parse(
const std::string& Function,
const std::string& Vars,
83 bool useDegrees =
false);
85 void setDelimiterChar(
char);
87 static Value_t epsilon();
88 static void setEpsilon(Value_t);
90 const char* ErrorMsg()
const;
91 ParseErrorType GetParseErrorType()
const;
93 Value_t Eval(
const Value_t* Vars);
94 int EvalError()
const;
96 bool AddConstant(
const std::string& name, Value_t value);
97 bool AddUnit(
const std::string& name, Value_t value);
99 typedef Value_t (*FunctionPtr)(
const Value_t*);
101 bool AddFunction(
const std::string& name,
102 FunctionPtr,
unsigned paramsAmount);
103 bool AddFunction(
const std::string& name, FunctionParserBase&);
109 class FunctionWrapper {
110 unsigned mReferenceCount;
111 friend class FunctionParserBase<Value_t>;
115 FunctionWrapper(): mReferenceCount(1) {}
116 FunctionWrapper(
const FunctionWrapper&): mReferenceCount(1) {}
117 virtual ~FunctionWrapper() {}
118 FunctionWrapper& operator=(
const FunctionWrapper&) {
return *
this; }
120 virtual Value_t callFunction(
const Value_t*) = 0;
123 template<
typename DerivedWrapper>
124 bool AddFunctionWrapper(
const std::string& name,
const DerivedWrapper&,
125 unsigned paramsAmount);
127 FunctionWrapper* GetFunctionWrapper(
const std::string& name);
129 bool RemoveIdentifier(
const std::string& name);
134 int ParseAndDeduceVariables(
const std::string&
function,
135 int* amountOfVariablesFound = 0,
136 bool useDegrees =
false);
137 int ParseAndDeduceVariables(
const std::string&
function,
138 std::string& resultVarString,
139 int* amountOfVariablesFound = 0,
140 bool useDegrees =
false);
141 int ParseAndDeduceVariables(
const std::string&
function,
142 std::vector<std::string>& resultVars,
143 bool useDegrees =
false);
146 FunctionParserBase();
147 ~FunctionParserBase();
151 FunctionParserBase(
const FunctionParserBase&);
152 FunctionParserBase& operator=(
const FunctionParserBase&);
155 void ForceDeepCopy();
159 #ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
163 void InjectRawByteCode(
const unsigned* bytecode,
unsigned bytecodeAmount,
164 const Value_t* immed,
unsigned immedAmount,
167 void PrintByteCode(std::ostream& dest,
bool showExpression =
true)
const;
178 Data* getParserData();
185 friend class FPoptimizer_CodeTree::CodeTree<Value_t>;
191 static Value_t sEpsilon;
197 bool CheckRecursiveLinking(
const FunctionParserBase*)
const;
198 bool NameExists(
const char*,
unsigned);
199 bool ParseVariables(
const std::string&);
200 int ParseFunction(
const char*,
bool);
201 const char* SetErrorType(ParseErrorType,
const char*);
203 void AddFunctionOpcode(
unsigned);
204 void AddImmedOpcode(Value_t v);
206 void CompilePowi(
long);
207 bool TryCompilePowi(Value_t);
209 const char* CompileIf(
const char*);
210 const char* CompileFunctionParams(
const char*,
unsigned);
211 const char* CompileElement(
const char*);
212 const char* CompilePossibleUnit(
const char*);
213 const char* CompilePow(
const char*);
214 const char* CompileUnaryMinus(
const char*);
215 const char* CompileMult(
const char*);
216 const char* CompileAddition(
const char*);
217 const char* CompileComparison(
const char*);
218 const char* CompileAnd(
const char*);
219 const char* CompileExpression(
const char*);
220 inline const char* CompileFunction(
const char*,
unsigned);
221 inline const char* CompileParenthesis(
const char*);
222 inline const char* CompileLiteral(
const char*);
223 template<
bool SetFlag>
224 inline void PushOpcodeParam(
unsigned);
225 template<
bool SetFlag>
226 inline void PutOpcodeParamAt(
unsigned,
unsigned offset);
227 const char* Compile(
const char*);
229 bool addFunctionWrapperPtr(
const std::string&, FunctionWrapper*,
unsigned);
230 static void incFuncWrapperRefCount(FunctionWrapper*);
231 static unsigned decFuncWrapperRefCount(FunctionWrapper*);
235 static std::pair<const char*, Value_t> ParseLiteral(
const char*);
236 static unsigned ParseIdentifier(
const char*);
240 class FunctionParser_f:
public FunctionParserBase<float> {};
241 class FunctionParser_ld:
public FunctionParserBase<long double> {};
242 class FunctionParser_li:
public FunctionParserBase<long> {};
245 class FunctionParser_cd:
public FunctionParserBase<std::complex<double> > {};
246 class FunctionParser_cf:
public FunctionParserBase<std::complex<float> > {};
247 class FunctionParser_cld:
public FunctionParserBase<std::complex<long double> > {};
249 template<
typename Value_t>
250 template<
typename DerivedWrapper>
251 bool FunctionParserBase<Value_t>::AddFunctionWrapper
252 (
const std::string& name,
const DerivedWrapper& wrapper,
unsigned paramsAmount)
254 return addFunctionWrapperPtr
255 (name,
new DerivedWrapper(wrapper), paramsAmount);
Parse a mathematical function specified in a string.