added debug option
This commit is contained in:
@ -59,7 +59,8 @@ using namespace std;
|
|||||||
* \param param the parameter vector
|
* \param param the parameter vector
|
||||||
* \param map the map vector
|
* \param map the map vector
|
||||||
*/
|
*/
|
||||||
PFunction::PFunction(tree_parse_info<> info, vector<double> param, vector<int> map)
|
PFunction::PFunction(tree_parse_info<> info, vector<double> param, vector<int> map, bool debug) :
|
||||||
|
fDebug(debug)
|
||||||
{
|
{
|
||||||
cout << endl << "in PFunction ...";
|
cout << endl << "in PFunction ...";
|
||||||
|
|
||||||
@ -71,6 +72,12 @@ PFunction::PFunction(tree_parse_info<> info, vector<double> param, vector<int> m
|
|||||||
fValid = true;
|
fValid = true;
|
||||||
fFuncNo = -1;
|
fFuncNo = -1;
|
||||||
|
|
||||||
|
// print out ast tree
|
||||||
|
if (fDebug) {
|
||||||
|
PrintTree(info);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// check parameter and map range
|
// check parameter and map range
|
||||||
if (!CheckParameterAndMapRange()) {
|
if (!CheckParameterAndMapRange()) {
|
||||||
fValid = false;
|
fValid = false;
|
||||||
@ -154,7 +161,6 @@ bool PFunction::CheckParameterAndMapInTree(iter_t const& i)
|
|||||||
fValid = false;
|
fValid = false;
|
||||||
}
|
}
|
||||||
} else if (i->value.id() == PFunctionGrammar::functionID) {
|
} else if (i->value.id() == PFunctionGrammar::functionID) {
|
||||||
cout << endl << "children = " << i->children.size() << endl;
|
|
||||||
assert(i->children.size() == 4);
|
assert(i->children.size() == 4);
|
||||||
// i: 'funcName', '(', 'expression', ')'
|
// i: 'funcName', '(', 'expression', ')'
|
||||||
success = CheckParameterAndMapInTree(i->children.begin()+2); // thats the real stuff
|
success = CheckParameterAndMapInTree(i->children.begin()+2); // thats the real stuff
|
||||||
@ -163,12 +169,12 @@ cout << endl << "children = " << i->children.size() << endl;
|
|||||||
assert(i->children.size() == 1);
|
assert(i->children.size() == 1);
|
||||||
success = CheckParameterAndMapInTree(i->children.begin());
|
success = CheckParameterAndMapInTree(i->children.begin());
|
||||||
} else if (i->value.id() == PFunctionGrammar::termID) {
|
} else if (i->value.id() == PFunctionGrammar::termID) {
|
||||||
// '*'/'/' i: lhs, rhs
|
// '*' or '/' i: lhs, rhs
|
||||||
assert(i->children.size() == 2);
|
assert(i->children.size() == 2);
|
||||||
success = CheckParameterAndMapInTree(i->children.begin());
|
success = CheckParameterAndMapInTree(i->children.begin());
|
||||||
success = CheckParameterAndMapInTree(i->children.begin()+1);
|
success = CheckParameterAndMapInTree(i->children.begin()+1);
|
||||||
} else if (i->value.id() == PFunctionGrammar::expressionID) {
|
} else if (i->value.id() == PFunctionGrammar::expressionID) {
|
||||||
// '+'/'-' i: lhs, rhs
|
// '+' or '-' i: lhs, rhs
|
||||||
assert(i->children.size() == 2);
|
assert(i->children.size() == 2);
|
||||||
success = CheckParameterAndMapInTree(i->children.begin());
|
success = CheckParameterAndMapInTree(i->children.begin());
|
||||||
success = CheckParameterAndMapInTree(i->children.begin()+1);
|
success = CheckParameterAndMapInTree(i->children.begin()+1);
|
||||||
@ -618,3 +624,153 @@ long PFunction::EvalTreeExpression(iter_t const& i)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------
|
||||||
|
// PrintTree (protected)
|
||||||
|
//-------------------------------------------------------------
|
||||||
|
long PFunction::PrintTree(tree_parse_info<> info)
|
||||||
|
{
|
||||||
|
cout << endl << "********************************************";
|
||||||
|
cout << endl << ">> PrintTree";
|
||||||
|
cout << endl << "********************************************";
|
||||||
|
long value = PrintTreeExpression(info.trees.begin());
|
||||||
|
cout << endl << "********************************************";
|
||||||
|
cout << endl;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------
|
||||||
|
// PrintTreeExpression (protected)
|
||||||
|
//-------------------------------------------------------------
|
||||||
|
long PFunction::PrintTreeExpression(iter_t const& i)
|
||||||
|
{
|
||||||
|
string str;
|
||||||
|
iter_t j;
|
||||||
|
|
||||||
|
if (i->value.id() == PFunctionGrammar::realID) {
|
||||||
|
if (i->children.size() == 0) {
|
||||||
|
str = string(i->value.begin(), i->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
} else {
|
||||||
|
for (unsigned int k=0; k<i->children.size(); k++) {
|
||||||
|
j = i->children.begin()+k;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << "!> " << str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (i->value.id() == PFunctionGrammar::funLabelID) {
|
||||||
|
if (i->children.size() == 0) {
|
||||||
|
j = i->children.begin();
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
} else {
|
||||||
|
for (unsigned int k=0; k<i->children.size(); k++) {
|
||||||
|
j = i->children.begin()+k;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << "!> " << str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (i->value.id() == PFunctionGrammar::parameterID) {
|
||||||
|
if (i->children.size() == 0) {
|
||||||
|
str = string(i->value.begin(), i->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
} else {
|
||||||
|
for (unsigned int k=0; k<i->children.size(); k++) {
|
||||||
|
j = i->children.begin()+k;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << "!> " << str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (i->value.id() == PFunctionGrammar::mapID) {
|
||||||
|
if (i->children.size() == 0) {
|
||||||
|
str = string(i->value.begin(), i->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
} else {
|
||||||
|
for (unsigned int k=0; k<i->children.size(); k++) {
|
||||||
|
j = i->children.begin()+k;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << "!> " << str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (i->value.id() == PFunctionGrammar::functionID) {
|
||||||
|
// i: 'funcName', '(', 'expression', ')'
|
||||||
|
if (i->children.size() == 4) {
|
||||||
|
j = i->children.begin();
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
j = i->children.begin()+1;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
PrintTreeExpression(i->children.begin()+2);
|
||||||
|
j = i->children.begin()+3;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
} else {
|
||||||
|
for (unsigned int k=0; k<i->children.size(); k++) {
|
||||||
|
j = i->children.begin()+k;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << "!> " << str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (i->value.id() == PFunctionGrammar::factorID) {
|
||||||
|
// i: real | parameter | map | function | expression
|
||||||
|
if (i->children.size() == 1) {
|
||||||
|
PrintTreeExpression(i->children.begin());
|
||||||
|
} else {
|
||||||
|
for (unsigned int k=0; k<i->children.size(); k++) {
|
||||||
|
j = i->children.begin()+k;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << "!> " << str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (i->value.id() == PFunctionGrammar::termID) {
|
||||||
|
// '*' or '/' i: lhs, rhs
|
||||||
|
str = string(i->value.begin(), i->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
if (i->children.size() == 2) {
|
||||||
|
PrintTreeExpression(i->children.begin());
|
||||||
|
PrintTreeExpression(i->children.begin()+1);
|
||||||
|
} else {
|
||||||
|
for (unsigned int k=0; k<i->children.size(); k++) {
|
||||||
|
j = i->children.begin()+k;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << "!> " << str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (i->value.id() == PFunctionGrammar::expressionID) {
|
||||||
|
// '+' or '-' i: lhs, rhs
|
||||||
|
str = string(i->value.begin(), i->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
if (i->children.size() == 2) {
|
||||||
|
PrintTreeExpression(i->children.begin());
|
||||||
|
PrintTreeExpression(i->children.begin()+1);
|
||||||
|
} else {
|
||||||
|
for (unsigned int k=0; k<i->children.size(); k++) {
|
||||||
|
j = i->children.begin()+k;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << "!> " << str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (i->value.id() == PFunctionGrammar::assignmentID) {
|
||||||
|
// i: 'funx', '=', 'expression'
|
||||||
|
if (i->children.size() == 3) {
|
||||||
|
j = i->children.begin();
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
j = i->children.begin()+1;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << ">> " << str;
|
||||||
|
PrintTreeExpression(i->children.begin()+2);
|
||||||
|
} else {
|
||||||
|
for (unsigned int k=0; k<i->children.size(); k++) {
|
||||||
|
j = i->children.begin()+k;
|
||||||
|
str = string(j->value.begin(), j->value.end());
|
||||||
|
cout << endl << "!> " << str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cout << endl << "this point should never have been reached :-(" << endl;
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -75,7 +75,7 @@ typedef struct func_tree_node {
|
|||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
class PFunction {
|
class PFunction {
|
||||||
public:
|
public:
|
||||||
PFunction(tree_parse_info<> info, vector<double> param, vector<int> map);
|
PFunction(tree_parse_info<> info, vector<double> param, vector<int> map, bool debug);
|
||||||
virtual ~PFunction();
|
virtual ~PFunction();
|
||||||
|
|
||||||
virtual bool IsValid() { return fValid; }
|
virtual bool IsValid() { return fValid; }
|
||||||
@ -96,12 +96,16 @@ class PFunction {
|
|||||||
virtual long EvaluateTree(tree_parse_info<> info);
|
virtual long EvaluateTree(tree_parse_info<> info);
|
||||||
virtual long EvalTreeExpression(iter_t const& i);
|
virtual long EvalTreeExpression(iter_t const& i);
|
||||||
|
|
||||||
|
virtual long PrintTree(tree_parse_info<> info);
|
||||||
|
virtual long PrintTreeExpression(iter_t const& i);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
tree_parse_info<> fInfo;
|
tree_parse_info<> fInfo;
|
||||||
vector<double> fParam;
|
vector<double> fParam;
|
||||||
vector<int> fMap;
|
vector<int> fMap;
|
||||||
PFuncTreeNode fFunc;
|
PFuncTreeNode fFunc;
|
||||||
|
|
||||||
|
bool fDebug;
|
||||||
bool fValid; ///< flag showing if the function is valid
|
bool fValid; ///< flag showing if the function is valid
|
||||||
int fFuncNo; ///< function number, i.e. FUNx with x the function number
|
int fFuncNo; ///< function number, i.e. FUNx with x the function number
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ struct PFunctionGrammar : public grammar<PFunctionGrammar>
|
|||||||
| (root_node_d[ch_p('-')] >> term)
|
| (root_node_d[ch_p('-')] >> term)
|
||||||
);
|
);
|
||||||
|
|
||||||
assignment = (fun_label >> ch_p('=') >> expression);
|
assignment = fun_label >> ch_p('=') >> expression;
|
||||||
// End grammar definition
|
// End grammar definition
|
||||||
|
|
||||||
// turn on the debugging info.
|
// turn on the debugging info.
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
*
|
*
|
||||||
* \param fln
|
* \param fln
|
||||||
*/
|
*/
|
||||||
PFunctionHandler::PFunctionHandler(char *fln)
|
PFunctionHandler::PFunctionHandler(char *fln, bool debug) : fDebug(debug)
|
||||||
{
|
{
|
||||||
fValid = true;
|
fValid = true;
|
||||||
fFileName = QString(fln);
|
fFileName = QString(fln);
|
||||||
@ -186,7 +186,7 @@ cout << endl << "fLines[" << i << "] = '" << fLines[i].latin1() << "'";
|
|||||||
|
|
||||||
if (info.full) {
|
if (info.full) {
|
||||||
cout << endl << "parse successfull ..." << endl;
|
cout << endl << "parse successfull ..." << endl;
|
||||||
PFunction func(info, fParam, fMap);
|
PFunction func(info, fParam, fMap, fDebug);
|
||||||
fFuncs.push_back(func);
|
fFuncs.push_back(func);
|
||||||
} else {
|
} else {
|
||||||
cout << endl << "parse failed ... (" << i << ")" << endl;
|
cout << endl << "parse failed ... (" << i << ")" << endl;
|
||||||
|
@ -44,7 +44,7 @@ using namespace std;
|
|||||||
class PFunctionHandler
|
class PFunctionHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PFunctionHandler(char *fln);
|
PFunctionHandler(char *fln, bool debug);
|
||||||
PFunctionHandler(vector<QString> lines);
|
PFunctionHandler(vector<QString> lines);
|
||||||
virtual ~PFunctionHandler();
|
virtual ~PFunctionHandler();
|
||||||
|
|
||||||
@ -55,6 +55,7 @@ class PFunctionHandler
|
|||||||
virtual unsigned int GetNoOfFuncs() { return fFuncs.size(); }
|
virtual unsigned int GetNoOfFuncs() { return fFuncs.size(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool fDebug;
|
||||||
bool fValid;
|
bool fValid;
|
||||||
|
|
||||||
QString fFileName;
|
QString fFileName;
|
||||||
|
@ -17,7 +17,8 @@
|
|||||||
PAR 1.0 2.1 3.5 -0.87 0.87
|
PAR 1.0 2.1 3.5 -0.87 0.87
|
||||||
MAP 2 1 4 5
|
MAP 2 1 4 5
|
||||||
FUNCTIONS
|
FUNCTIONS
|
||||||
fun0 = sin(par3/(par1+map2))
|
#fun0 = sin(par3/(par1+map2))
|
||||||
|
fun1 = 1.0+(((sin(par1))))
|
||||||
#fun0 = par1 + map3 * cos(cos(par2 - map1))
|
#fun0 = par1 + map3 * cos(cos(par2 - map1))
|
||||||
#fun8 = log(sin(par1)) + exp(-1.0*map2)
|
#fun8 = log(sin(par1)) + exp(-1.0*map2)
|
||||||
#fun1 = par1 + map1 * (0.01355+par1*(2.1 - (-2.3 / 3.4)))
|
#fun1 = par1 + map1 * (0.01355+par1*(2.1 - (-2.3 / 3.4)))
|
||||||
|
@ -6,10 +6,11 @@ using namespace std;
|
|||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
void syntax()
|
void syntax()
|
||||||
{
|
{
|
||||||
cout << endl << "spirit_fcn_test [--file <filename>] | [--help]";
|
cout << endl << "spirit_fcn_test [--file <filename> [--debug]] | [--help]";
|
||||||
cout << endl << " without arguments: interactive mode";
|
cout << endl << " without arguments: interactive mode";
|
||||||
cout << endl << " --file <filename>: function block etc. from file";
|
cout << endl << " --file <filename>: function block etc. from file";
|
||||||
cout << endl << " --help: this help";
|
cout << endl << " --help: this help";
|
||||||
|
cout << endl << " --debug: will print the ast tree only (no evaluatio)";
|
||||||
cout << endl << endl;
|
cout << endl << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,26 +48,35 @@ void handle_input(vector<QString> &lines)
|
|||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
bool inputFile = false;
|
bool inputFile = false;
|
||||||
|
bool debug = false;
|
||||||
|
|
||||||
if (argc > 3) {
|
if (argc > 4) {
|
||||||
syntax();
|
syntax();
|
||||||
return 0;
|
return 0;
|
||||||
} else if (argc == 2) {
|
} else if (argc == 2) {
|
||||||
syntax();
|
syntax();
|
||||||
return 0;
|
return 0;
|
||||||
} else if (argc == 3) {
|
} else if (argc >= 3) {
|
||||||
if (strcmp(argv[1], "--file")) {
|
if (strcmp(argv[1], "--file")) {
|
||||||
syntax();
|
syntax();
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
inputFile = true;
|
inputFile = true;
|
||||||
}
|
}
|
||||||
|
if (argc == 4) {
|
||||||
|
if (strcmp(argv[3], "--debug")) {
|
||||||
|
syntax();
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
debug = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PFunctionHandler *fcnHandler = 0;
|
PFunctionHandler *fcnHandler = 0;
|
||||||
|
|
||||||
if (inputFile) {
|
if (inputFile) {
|
||||||
fcnHandler = new PFunctionHandler(argv[2]);
|
fcnHandler = new PFunctionHandler(argv[2], debug);
|
||||||
} else {
|
} else {
|
||||||
vector<QString> lines;
|
vector<QString> lines;
|
||||||
handle_input(lines);
|
handle_input(lines);
|
||||||
@ -84,9 +94,11 @@ cout << endl << "lines.size() = " << lines.size();
|
|||||||
if (go_on) {
|
if (go_on) {
|
||||||
cout << endl << "will do the parsing ...";
|
cout << endl << "will do the parsing ...";
|
||||||
if (fcnHandler->DoParse()) {
|
if (fcnHandler->DoParse()) {
|
||||||
cout << endl << "will do the evaluation ...";
|
if (!debug) {
|
||||||
for (unsigned int i=0; i<fcnHandler->GetNoOfFuncs(); i++)
|
cout << endl << "will do the evaluation ...";
|
||||||
cout << endl << "FUN" << fcnHandler->GetFuncNo(i) << " = " << fcnHandler->Eval(fcnHandler->GetFuncNo(i));
|
for (unsigned int i=0; i<fcnHandler->GetNoOfFuncs(); i++)
|
||||||
|
cout << endl << "FUN" << fcnHandler->GetFuncNo(i) << " = " << fcnHandler->Eval(fcnHandler->GetFuncNo(i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user