Isis 3 Programmer Reference
|
A parser for converting equation strings to postfix. More...
#include <InlineInfixToPostfix.h>
Public Member Functions | |
InlineInfixToPostfix () | |
Constructs an InlineInfixToPostfix object. More... | |
virtual | ~InlineInfixToPostfix () |
Destroys the InlineInfixToPostfix object. 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 attempts to verify that the given argument is recognized as a valid function, operator, scalar, or variable. More... | |
virtual InfixOperator * | findOperator (QString element) |
This method will first search the recognized list of operators and functions for the given token. More... | |
Protected Attributes | |
QList< InfixOperator * > | p_operators |
Private Member Functions | |
void | initialize () |
Adds several infix operators and functions to the operator list that are not already recognized by the parent class, InfixToPostfix. More... | |
bool | exists (const QString &str) |
Determines whether the given string exists as a recognized variable. More... | |
bool | isScalar (const QString &scalar) |
Determines whether the given token represents a scalar value (i.e. More... | |
bool | isVariable (const QString &str) |
Determines whether the given token is a variable and, if so, appends it to the list of variables. 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) |
Private Attributes | |
QStringList | m_variables |
The list of variables (represented as strings). More... | |
A parser for converting equation strings to postfix.
This class converts infix equations to postfix for parsing.
Definition at line 34 of file InlineInfixToPostfix.h.
Isis::InlineInfixToPostfix::InlineInfixToPostfix | ( | ) |
Constructs an InlineInfixToPostfix object.
The operators list is filled with string representations of known symbols, recognized by both this class and the parent class.
Definition at line 24 of file InlineInfixToPostfix.cpp.
References initialize().
|
virtual |
Destroys the InlineInfixToPostfix object.
Definition at line 32 of file InlineInfixToPostfix.cpp.
|
privateinherited |
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 287 of file InfixToPostfix.cpp.
|
privateinherited |
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 109 of file InfixToPostfix.cpp.
References Isis::IString::Token(), and Isis::IString::ToQt().
|
privateinherited |
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 316 of file InfixToPostfix.cpp.
|
inherited |
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 139 of file InfixToPostfix.cpp.
References Isis::IString::Remove(), Isis::toDouble(), Isis::IString::Token(), and Isis::IString::ToQt().
Referenced by Isis::InlineCalculator::toPostfix().
|
private |
Determines whether the given string exists as a recognized variable.
NOTE: This list is constructed using the isVariable() method.
token | A string token to be compared to the recognized variable list. |
Definition at line 136 of file InlineInfixToPostfix.cpp.
References m_variables.
|
protectedvirtual |
This method will first search the recognized list of operators and functions for the given token.
If found, it will return a pointer to the represented operator or function. If not found, the method checks whether the given token is a variable. If it is a variable, a new operator is constructed from the given token and a pointer to the represented variable is returned. If the given token is neither an operator, a function nor a variable, then an exception is thrown.
token | The symbolic representation of the operator, function, or variable |
IException::User | "The token is not recognized as an operator, function or variable." |
Reimplemented from Isis::InfixToPostfix.
Definition at line 81 of file InlineInfixToPostfix.cpp.
References Isis::InfixToPostfix::findOperator(), isVariable(), and Isis::IException::User.
|
privateinherited |
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 479 of file InfixToPostfix.cpp.
References Isis::IString::Token(), and Isis::IString::ToQt().
|
private |
Adds several infix operators and functions to the operator list that are not already recognized by the parent class, InfixToPostfix.
Definition at line 108 of file InlineInfixToPostfix.cpp.
Referenced by InlineInfixToPostfix().
|
privateinherited |
This method will return true if 'representation' is a known function.
representation | The symbolic representation of a function, such as 'abs' |
Definition at line 270 of file InfixToPostfix.cpp.
|
protectedvirtual |
This method attempts to verify that the given argument is recognized as a valid function, operator, scalar, or variable.
representation | The symbolic representation of the operator |
Reimplemented from Isis::InfixToPostfix.
Definition at line 44 of file InlineInfixToPostfix.cpp.
References Isis::InfixToPostfix::isKnownSymbol(), isScalar(), and isVariable().
|
private |
Determines whether the given token represents a scalar value (i.e.
whether it can be converted to a double).
token | String to be tested. |
Definition at line 149 of file InlineInfixToPostfix.cpp.
References Isis::toDouble().
Referenced by isKnownSymbol().
|
private |
Determines whether the given token is a variable and, if so, appends it to the list of variables.
A token is considered a variable if it is not a known operator symbol from the parent InfixToPostfix class, not a scalar, and is not empty. Variables are implemented as functions, so new variables are also added to the operators list.
token | A string containing the token to be tested. |
Definition at line 178 of file InlineInfixToPostfix.cpp.
References m_variables.
Referenced by findOperator(), and isKnownSymbol().
|
inherited |
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 369 of file InfixToPostfix.cpp.
References Isis::IString::DownCase(), and Isis::IString::ToQt().
|
privateinherited |
This cleans the known operators/functions list.
Definition at line 89 of file InfixToPostfix.cpp.
|
private |
The list of variables (represented as strings).
Definition at line 50 of file InlineInfixToPostfix.h.
Referenced by exists(), and isVariable().