USGS

Isis 3.0 Object Programmers' Reference

Home

InfixToPostfix.h

Go to the documentation of this file.
00001 
00023 #ifndef INFIXTOPOSTFIX_H_
00024 #define INFIXTOPOSTFIX_H_
00025 
00026 #include <stack>
00027 #include <iostream>
00028 
00029 #include <QList>
00030 #include <QString>
00031 
00032 namespace Isis {
00033   class InfixOperator;
00034   class InfixFunction;
00035 
00057   class InfixToPostfix {
00058     public:
00059       InfixToPostfix();
00060       virtual ~InfixToPostfix();
00061 
00062       QString convert(const QString &infix);
00063       QString tokenizeEquation(const QString &equation);
00064 
00065     protected:
00066 
00067       virtual bool isKnownSymbol(QString representation);
00068       virtual InfixOperator *findOperator(QString representation);
00069 
00070       QList<InfixOperator *> p_operators;
00071 
00072     private:
00073       void initialize();
00074       void uninitialize();
00075 
00076       QString formatFunctionCalls(QString equation);
00077       QString cleanSpaces(QString equation);
00078 
00079       void closeParenthesis(QString &postfix, std::stack<InfixOperator> &theStack);
00080       void addOperator(QString &postfix, const InfixOperator &op, std::stack<InfixOperator> &theStack);
00081       bool isFunction(QString representation);
00082       void checkArgument(QString funcName, int argNum, QString argument);
00083   };
00084 
00092   class InfixOperator {
00093     public:
00094       InfixOperator(int prec, QString inString, bool isFunc = false) {
00095         m_precedence = prec;
00096         m_inputString = inString;
00097         m_outputString = inString;
00098         m_isFunction = isFunc;
00099       }
00100 
00101       InfixOperator(int prec, QString inString, QString outString,
00102                     bool isFunc = false) {
00103         m_precedence = prec;
00104         m_inputString = inString;
00105         m_outputString = outString;
00106         m_isFunction = isFunc;
00107       }
00108 
00109       const QString &inputString() const {
00110         return m_inputString;
00111       }
00112 
00113       const QString &outputString() const {
00114         return m_outputString;
00115       }
00116 
00117       int precedence() const {
00118         return m_precedence;
00119       }
00120 
00121       bool isFunction() const {
00122         return m_isFunction;
00123       }
00124 
00125 
00126     private:
00127       int m_precedence;
00128       QString m_inputString;
00129       QString m_outputString;
00130       bool m_isFunction;
00131   };
00132 
00133 
00141   class InfixFunction : public InfixOperator {
00142     public:
00143       InfixFunction(QString inString, int argCount) :
00144         InfixOperator(-1, inString, true) {
00145         m_numArguments = argCount;
00146       }
00147 
00148       InfixFunction(QString inString, QString outString, int argCount) :
00149         InfixOperator(-1, inString, outString, true) {
00150         m_numArguments = argCount;
00151       }
00152 
00153       int argumentCount() const {
00154         return m_numArguments;
00155       }
00156 
00157     private:
00158       int m_numArguments;
00159   };
00160 };
00161 
00162 #endif