|
Isis 3.0 Object Programmers' Reference |
Home |
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