This isn't a school assignment or anything, but I realize it's a mostly academic question. But, what I've been struggling to do is parse 'math' text and come up with an answer.
For Example - I can figure out how to parse '5 + 5' or '3 * 5' - but I fail when I try to correctly chain operations together.
(5 + 5) * 3
It's mostly just bugging me that I can't figure it out. If anyone can point me in a direction, I'd really appreciate it.
EDIT Thanks for all of the quick responses. I'm sorry I didn't do a better job of explaining.
First - I'm not using regular expressions. I also know there are already libraries available that will take, as a string, a mathematical expression and return the correct value. So, I'm mostly looking at this because, sadly, I don't "get it".
Second - What I've tried doing (is probably misguided) but I was counting '(' and ')' and evaluating the deepest items first. In simple examples, this worked; but my code is not pretty and more complicated stuff crashes. When I 'calculated' the lowest level, I was modifying the string.
So... (5 + 5) * 3
Would turn into 10 * 3
Which would then evaluate to 30
But it just felt 'wrong'.
I hope that helps clarify things. I'll certainly check out the links provided.
There is always an option to use math parser library, such as mXparser. You can:
1 - Check expression syntax
Result:
[mXparser-v.4.0.0]
2 - Evaluate expression
Result:
3 - Use built-in functions constants, operators, etc..
Result:
4 - Define your own functions, arguments and constants
Result:
5 - Tokenize expression string and play with expression tokens
Result:
6 - You can find much more in mXparser tutorial, mXparser math collection and mXparser API definition.
7 - mXparser supports:
Additionally - this software is using mXparser as well - you can learn the syntax Scalar Calculator app.
Best regards
Essentially, you are asking us how to write a "parser." Here is another Stack Overflow question about parsers: hand coding a parser
Last year-ish I wrote a basic math evaluator for reasons I can't remember. It is not in any way a "proper" parser by any stretch of the term, and .. like all old code, I'm not that proud of it now.
But you can take a look and see if it helps you.
You run some input tests by launching this standalone Java app
Take your pick, Code Golf: Mathematical expression evaluator (that respects PEMDAS)
Here is a simple (naive operator precedence) grammar for what you want.
When you process "factor" you just check whether the next token is a number or "(", if it's a "(" then you parse "expression" again, when expression returns you check if the next token is ")". You could have the [calculated|read] values bubble up to the parent through the use of out or ref parameters, or build an expression tree.
Here is the same thing in EBNF:
When I wanted to parse something I decided to use the GOLD Parser:
The parser includes sample grammars, including e.g. one for operator prcedence.
Apart from GOLD are also other more famous parsers, e.g. ANTLR, which I haven't used.