# From string to formular

I am going to write a program which should handle the math.
formular entered by the user. Excactly to say: if the program is
statrd, it shows a edit window and the user can enter a math.
formular in any form such as (a+b)*x/y, 5*sin(x+a) etc.. The
problem is, the program reads the formular as a string, not as a
formular. I was told it's quite complicated to write a program to
translate the string to a formular.

Dos someone have any good idea?
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
You have to parse the expression, then evaluate it. Complexity depends a bit on how much math it is supposed to handle. Check out.

http://www.snippets.org/#section1group12

De main trick to this is to get a decent grammar for the expressions you'r expected. Check out your C and C++ documentation for how their expression grammar is defined. The grammar will directly lead to a parser implementation.
0
Commented:
I can give example code of a simple prefix expression parser if you want.
0
Author Commented:
0
Commented:
0
Commented:
/*
Infix.C

Simple Infix Expression Grammar, intended as starting point, it's by far not complete and does not perform the actual evaluation yet.

primairy_expression:
literal
(expression)

multiplicative_expression:
primairy_expression
multiplicative_expression * primairy_expression
multiplicative_expression / primairy_expression
multiplicative_expression % primairy_expression

multiplicative_expression

This grammar is easily and directly translated into a program. It only
parses additive (+ and -) and multiplicative (*, / and%) expressions to
demonstrate implementation of precedence. Other operators and their

Note:      Postfix output is obtained by replacing the printf() statements
with pushes onto the postfix expression (rpn) stack.
*/

#include <stdio.h>
#include <ctype.h>
#include <assert.h>

void  Error(char*);
char* SkipWhite(char*);
int   ParseInfixExpression(char*);
char* MultiplicativeExpression(char*);
char* PrimairyExpression(char*);
char* LiteralExpression(char*);

void Error(char* msg)
{
assert(msg != 0);
printf("Error: %s\n", msg);
}

char* SkipWhite(char* expression)
{
while(expression && isspace(*expression)) ++expression;
return expression;
}

int ParseInfixExpression(char* expression)
{
assert(expression != 0);
return !expression || (expression && *expression) ? 0 : 1;
}

{
assert(expression != 0);

/*      multiplicative_expression */
expression = SkipWhite(MultiplicativeExpression(expression));

while(expression && (*expression == '+' || *expression == '-'))
{
char* tmp = MultiplicativeExpression(expression+1);
if(tmp) printf("operator: %c\n", *expression);
expression = SkipWhite(tmp);
}
return expression;
}

char* MultiplicativeExpression(char* expression)
{
assert(expression != 0);

expression = SkipWhite( PrimairyExpression(expression) );
while( expression
&& ( *expression == '*' || *expression == '/' || *expression == '%')
)
{
char* tmp = PrimairyExpression(expression + 1);
if(tmp) printf("operator: %c\n", *expression);
expression = SkipWhite(tmp);
}
return expression;
}

char* PrimairyExpression( char* expression )
{
assert(expression != 0);
expression = SkipWhite(expression);
if(*expression == '(')
{
if(!expression)
return expression;
else if(expression && *expression != ')')
Error("Missing ')' in expression");
else ++expression; // skip the brace
}
else
expression = LiteralExpression(expression);
return expression;
}

char* LiteralExpression(char* expression)
{
int cursor = 0;
assert(expression != 0);
expression = SkipWhite(expression);

while( isalnum(expression[cursor]) ) ++cursor;
if(cursor)
{
char tmp = expression[cursor];
expression[cursor] = '\0';
printf("operand:  %s\n", expression);
expression[cursor] = tmp;
return expression + cursor;
}
else
{
return 0;
}
}

int main(int argc, char** argv)
{
if(argc < 2) return 1;
printf("Parsing ParseExpression: %s\n",argv[1]);
ParseInfixExpression(argv[1]);
return 0;
}
0
Author Commented:
0
Author Commented:
Could you update the page so I can give you the point?
0
Commented:
Thanx. If you have any further questions or need for explanations, please ask.
0

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Author Commented:
Could you update the page so I can give you the point?
0
Author Commented:
Thank you very much!
0
Commented:
Kangaroo you stole my answer that I stole from you!  :-)

Take a look at
http://www.experts-exchange.com/jsp/qShow.jsp?ta=cplusprog&qid=10240261
0
Author Commented:
Nietod is a very honest man. We all should learn from him.

But don't worry, Nietod, you can get points from me later. The 2000 is coming and I am sure I will have a lot of questions in 2000. :-)
0
Author Commented:
Nietod is a very honest man. We all should learn from him.

But don't worry, Nietod, you can get points from me later. The 2000 is coming and I am sure I will have a lot of questions in 2000. :-)
0
Commented:
He is, we all do learn from him, and I'm honoured that he's quoting me :-)
0
###### It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C++

From novice to tech pro — start learning today.