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 + -
显示快捷键?