I want to write a calculator which can take words as input.
for e.g. “two plus five multiply with 7” should give 37 as output.
I won’t lie, this is a homework so before doing this, I thought if I can be pointed to something which might be useful for these kinds of things and I am not aware of.
Also, approach n how to do this would be ok too , I guess. It has to be written in C++. No other language would be accepted.
Thanks.
[Edit] — Thanks for the answers. This is an introductory course. So keeping things as simple as possible would be appreciated. I should have mentioned this earlier.
[Edit 2] — Reached a stage where I can give input in numbers and get correct output with precedence and all. Just want to see how to convert word to number now. Thanks to everybody who is trying to help. This is why SO rocks.
As long as the acceptable input is strict enough, writing a recursive descent parser should be easy. The grammar for this shouldn’t differ much from a grammar for a simple calculator that only accepts digits and symbols.
With an
std::istreamclass and the extraction operator (>>) you can easily break the input into separate words.Here’s a lecture that shows how to do this for a regular calculator with digits and symbols.
The main difference from that in your case is parsing the numbers. Instead of the symbols ‘0-9’, your input will have words like “zero”, “one”, “nine”, “hundreds”, “thousands”, etc. To parse such a stream of words you can do something like this:
break the words into groups, nested by the “multipliers”, like “thousands”, “hundreds”, “billions”, etc; these groups can nest. Tens (“ten”, “twenty”, “thirty”), teens (“eleven”, “twelve”, “thirteen”, …), and units (“one”, “two”, “three”, …) don’t nest anything. You turn something like “one hundred and three thousands two hundred and ninety seven” into something like this:
for each group, recursively sum all its components, and then multiply it by its “multiplier”: