Isis 3 Programmer Reference
|
Converter for math equations. More...
#include <InfixToPostfix.h>
Public Member Functions | |
InfixToPostfix () | |
Constructor. More... | |
QString | convert (const QString &infix) |
This method converts infix to postfix. More... | |
QString | tokenizeEquation (const QString &equation) |
This method will add spaces between all operators and numbers, making it possible to get each element of the equation one by one. More... | |
Protected Member Functions | |
virtual bool | isKnownSymbol (QString representation) |
This method will return true if it believes the argument represents a valid function or operator. More... | |
virtual InfixOperator * | findOperator (QString representation) |
This method will return a pointer to the operator represented by 'representation. More... | |
Protected Attributes | |
QList< InfixOperator * > | p_operators |
Private Member Functions | |
void | initialize () |
This populates the known operators/functions list. More... | |
void | uninitialize () |
This cleans the known operators/functions list. More... | |
QString | formatFunctionCalls (QString equation) |
This method looks through equation for function calls, parenthesizes them, and calls itself again with each argument in order to parse any embedded functions. More... | |
QString | cleanSpaces (QString equation) |
This function takes a space-delimited string and removes empty delimiters. More... | |
void | closeParenthesis (QString &postfix, std::stack< InfixOperator > &theStack) |
This is straight from the algorithm found on page 159 of "Data Structures & Algorithms in Java" Second Edition by Robert Lafore. More... | |
void | addOperator (QString &postfix, const InfixOperator &op, std::stack< InfixOperator > &theStack) |
This is straight from the algorithm found on page 159 of "Data Structures & Algorithms in Java" Second Edition by Robert Lafore. More... | |
bool | isFunction (QString representation) |
This method will return true if 'representation' is a known function. More... | |
void | checkArgument (QString funcName, int argNum, QString argument) |
Converter for math equations.
This class converts infix equations to postfix
2007-08-22 Steven Lambright - Changed p_operators from vector to QList (static std::vector is unsafe)
2008-01-23 Steven Lambright - Added the operators (constants) PI and e
2010-02-23 Steven Lambright - Operator/Function input strings and output strings now separated
2010-04-08 Steven Lambright - Min, max functions expanded upon
2012-01-09 Jeff Anderson - Modified to conform ISIS programming standards
2017-01-09 Jesse Mapel - Modified to allow for "_" in variables. Fixes #4581.
2017-01-09 Jesse Mapel - Added logical and, or operators. Fixes #4581.
Definition at line 61 of file InfixToPostfix.h.
Isis::InfixToPostfix::InfixToPostfix | ( | ) |
Constructor.
Definition at line 34 of file InfixToPostfix.cpp.
|
private |
This is straight from the algorithm found on page 159 of "Data Structures & Algorithms in Java" Second Edition by Robert Lafore.
postfix | The postix generated thus far |
op | The operator |
theStack | The operator stack |
Definition at line 302 of file InfixToPostfix.cpp.
|
private |
This function takes a space-delimited string and removes empty delimiters.
In order words, it compresses the spaces. This is used to keep strings small, clean, and remove the necessity to check for empty tokens constantly.
That is, if your string is "a b" the result will be "a b".
equation | A space-delimited string with excessive spaces |
Definition at line 124 of file InfixToPostfix.cpp.
References Isis::IString::Token(), and Isis::IString::ToQt().
|
private |
This is straight from the algorithm found on page 159 of "Data Structures & Algorithms in Java" Second Edition by Robert Lafore.
postfix | The postix generated thus far |
theStack | The operator stack |
Definition at line 331 of file InfixToPostfix.cpp.
References _FILEINFO_.
QString Isis::InfixToPostfix::convert | ( | const QString & | infix | ) |
This method converts infix to postfix.
It uses an enhanced verion of the algorithm found on page 159 of "Data Structures & Algorithms in Java" Second Edition by Robert Lafore. First, we prep the equation with TokenizeEquation and then parse through it using the known-good algorithm.
infix | The infix equation |
Definition at line 154 of file InfixToPostfix.cpp.
References _FILEINFO_, Isis::IString::Remove(), Isis::toDouble(), Isis::IString::Token(), and Isis::IString::ToQt().
Referenced by Isis::InlineCalculator::toPostfix().
|
protectedvirtual |
This method will return a pointer to the operator represented by 'representation.
' Because in this model a function is an operator, this will return a pointer to functions as well (in a base class pointer).
representation | The symbolic representation of the operator, such as '+' |
Reimplemented in Isis::CubeInfixToPostfix, and Isis::InlineInfixToPostfix.
Definition at line 362 of file InfixToPostfix.cpp.
References _FILEINFO_.
Referenced by Isis::InlineInfixToPostfix::findOperator().
|
private |
This method looks through equation for function calls, parenthesizes them, and calls itself again with each argument in order to parse any embedded functions.
This ensures order of operations holds for cases like sin(.5)^2. This method might add too many parentheses, but that is harmless. This does not affect operators (excepting –) or numbers. Only functions. The input should be space-delimited.
equation | The unparenthesized equation |
This code block is for multi-parameter functions. Functions with 1+ parameters are parsed here, excepting the negation (with no parentheses) which is done just above.
We figure out the arguments by looking for commas, outside of all parentheses, for each argument up until the last one. We look for an extra closing parenthesis for the last argument. When we figure out what an argument is, we recursively call FormatFunctionCalls to format any and all functionality inside of the argument.
Definition at line 494 of file InfixToPostfix.cpp.
References _FILEINFO_, Isis::IString::Token(), and Isis::IString::ToQt().
|
private |
This populates the known operators/functions list.
If the operators list is not empty, this function will do nothing.
Definition at line 46 of file InfixToPostfix.cpp.
|
private |
This method will return true if 'representation' is a known function.
representation | The symbolic representation of a function, such as 'abs' |
Definition at line 285 of file InfixToPostfix.cpp.
|
protectedvirtual |
This method will return true if it believes the argument represents a valid function or operator.
representation | The symbolic representation of the operator, such as 'sin' |
Reimplemented in Isis::CubeInfixToPostfix, and Isis::InlineInfixToPostfix.
Definition at line 268 of file InfixToPostfix.cpp.
Referenced by Isis::InlineInfixToPostfix::isKnownSymbol().
QString Isis::InfixToPostfix::tokenizeEquation | ( | const QString & | equation | ) |
This method will add spaces between all operators and numbers, making it possible to get each element of the equation one by one.
It will also parse out the function calls, adding parenthesis where needed so the user doesn't have to. The result is an equation ready for parsing (but NOT fully parenthesized, just enough to make sure our algorithm makes no mistakes).
equation | An unformatted infix equation |
Definition at line 384 of file InfixToPostfix.cpp.
References Isis::IString::DownCase(), and Isis::IString::ToQt().
|
private |
This cleans the known operators/functions list.
Definition at line 104 of file InfixToPostfix.cpp.