equalcalc.cpp
来自「图形软件,用QT编写的,可以用来学习软件的」· C++ 代码 · 共 232 行
CPP
232 行
/************************************************************************************************************************************************************** **** equal III the graphic builder **** **** Copyright (C) 2003 Oleksiy Pylypenko **** **** This file may be distributed and/or modified under the terms of the **** GNU General Public License version 2 as published by the Free Software **** Foundation and appearing in the file license included in the **** packaging of this file. **** **** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE **** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. **** **** Contact earthman@inbox.ru if any conditions of this licensing are **** not clear to you. **** **** ********************************************************************************* *****************************************************************************/#include "equal_headers.h"#include "equalcalc.h"EqualCalculator::EqualCalculator(void){ Init();}EqualCalculator::~EqualCalculator(){ Free();}void EqualCalculator::Init(void){ Free(); acontext.brck_decl.clear(); acontext.var_decl.clear(); acontext.func_decl.clear(); acontext.fbrck_decl.clear(); functions.clear(); //default declarations(definitions provided by x86_executor) {FunctionDeclaration mydecl("log" ,0,2,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("log" ,0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("ln" ,0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("sin" ,0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("cos" ,0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("tan" ,0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("sinh" ,0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("cosh" ,0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("tanh",0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("asin",0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("acos",0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("atan",0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("atan",0,2,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("sqrt",0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("^" ,1,1,5,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("abs" ,0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("exp" ,0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("floor",0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("ceil" ,0,1,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("mod" ,1,1,2,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("min" ,0,2,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("max" ,0,2,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("Pi" ,0,0,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("e" ,0,0,10,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("+",0,1,50,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("-",0,1,50,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("!",1,0,30,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("+",1,1,1,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("-",1,1,1,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("*",1,1,2,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {FunctionDeclaration mydecl("/",1,1,2,FunctionDeclaration::LR);acontext.func_decl.push_back(mydecl);} {BracketDeclaration mydecl = {'(',')'};acontext.brck_decl.push_back(mydecl);} {BracketDeclaration mydecl = {'[',']'};acontext.fbrck_decl.push_back(mydecl);} {BracketDeclaration mydecl = {'{','}'};acontext.fbrck_decl.push_back(mydecl);}// {BracketDeclaration mydecl = {'<','>'};acontext.fbrck_decl.push_back(mydecl);} acontext.bForceUnknownTermExecption = true;}void EqualCalculator::Free(void){ execContext.Free();// free_ptree(builtTree);// builtTree.clear(); size_t i; for(i = 0;i < functions.size();i++) free_ptree(functions[i].definition); functions.clear();}void EqualCalculator::DefineFunction(string name,vector<string> llist,vector<string> rlist,string definition,double priority){ UserFunction myfunction; myfunction.declaration.name = name; myfunction.declaration.nleft_Params = (int)llist.size(); myfunction.declaration.nright_Params = (int)rlist.size(); myfunction.declaration.order = FunctionDeclaration::LR; myfunction.declaration.priority = priority; ParsingContext newcontext = acontext; { for(vector<UserFunction>::iterator i = functions.begin();i != functions.end();i++) { const FunctionDeclaration &d = (*i).declaration; if( d.name == myfunction.declaration.name && d.nleft_Params == myfunction.declaration.nleft_Params && d.nright_Params == myfunction.declaration.nright_Params ){ functions.erase(i); break; } } } { for(vector<FunctionDeclaration>::iterator i = newcontext.func_decl.begin();i != newcontext.func_decl.end();i++) { const FunctionDeclaration &d = (*i); if( d.name == myfunction.declaration.name && d.nleft_Params == myfunction.declaration.nleft_Params && d.nright_Params == myfunction.declaration.nright_Params ){ newcontext.func_decl.erase(i); break; } } } ParsingContext another_context = newcontext; newcontext.func_decl.push_back(myfunction.declaration); vector<string>::iterator j;/* for(tvar_decl_vec::iterator k = another_context.var_decl.begin();k != another_context.var_decl.end();k++){ printf("%s\n",(*k).name.c_str()); }*/ for(j = llist.begin();j != llist.end();j++){ myfunction.vars.push_back(*j); undeclare_argument(another_context,*j); {VariableDeclaration mydecl(*j);another_context.var_decl.push_back(mydecl);} } for(j = rlist.begin();j != rlist.end();j++){ myfunction.vars.push_back(*j); undeclare_argument(another_context,*j); {VariableDeclaration mydecl(*j);another_context.var_decl.push_back(mydecl);} }/* for(tvar_decl_vec::iterator k = another_context.var_decl.begin();k != another_context.var_decl.end();k++){ printf("%s\n",(*k).name.c_str()); } for(tfunc_decl_vec::iterator k2 = another_context.func_decl.begin();k2 != another_context.func_decl.end();k2++){ printf("%s\n",(*k2).name.c_str()); }*/ pti_vec r = Parse(definition.c_str(),another_context);// if(r.size() != 1)// throw errDefineFunction();// cout << def << "\n";// r[0]->print(); for(vector<UserFunction>::iterator i = functions.begin();i != functions.end();i++) SubstituteFunction(r,*i); myfunction.definition = r; { for(int i = 0;i < (int)functions.size();i++){ if( functions[i].declaration.name == myfunction.declaration.name && functions[i].declaration.nleft_Params == myfunction.declaration.nleft_Params && functions[i].declaration.nright_Params == myfunction.declaration.nright_Params ){ free_ptree(functions[i].definition); functions[i] = myfunction; return; } } functions.push_back(myfunction); } acontext = newcontext;}void EqualCalculator::DefineVariable(string name,double *ptr){ {VariableDeclaration mydecl(name);acontext.var_decl.push_back(mydecl);} execContext.VariablesDefenition[name] = ptr;}pti_vec EqualCalculator::CompileSystem(string expression){ pti_vec builtTree = Parse(expression.c_str(),acontext); for(vector<UserFunction>::iterator i = functions.begin();i != functions.end();i++) SubstituteFunction(builtTree,*i); while(PreCalcOptimize(builtTree,executor)+ArithmeticOptimize(builtTree)); return builtTree;}double *EqualCalculator::PrepareCalculate(bPTI &atree){ execContext.Free(); return executor.Build(atree,execContext);}/*double *PrepareCalculate(string expression){ builtTree = Parse(expression.c_str(),acontext); // builtTree[0]->print(); for(vector<UserFunction>::iterator i = functions.begin();i != functions.end();i++) SubstituteFunction(builtTree,*i);// builtTree[0]->print(); while(PreCalcOptimize(builtTree,executor)+ArithmeticOptimize(builtTree));// builtTree[0]->print(); execContext.Free(); free_ptree(builtTree); builtTree.clear(); return r;}*//*void EqualCalculator::Calculate(void){ execContext.codes->execute();}*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?