00001 // -*- Mode: C++; tab-width: 2; -*- 00002 // vi: set ts=2: 00003 // 00004 00005 #ifndef BALL_KERNEL_EXPRESSIONPARSER_H 00006 #define BALL_KERNEL_EXPRESSIONPARSER_H 00007 00008 #ifndef BALL_KERNEL_EXPRESSION_TREE_H 00009 # include <BALL/KERNEL/expressionTree.h> 00010 #endif 00011 00012 namespace BALL 00013 { 00014 00022 class BALL_EXPORT ExpressionParser 00023 { 00024 public: 00025 00031 class BALL_EXPORT SyntaxTree 00032 { 00033 public: 00034 00038 00040 typedef list<SyntaxTree*>::iterator Iterator; 00041 00043 typedef list<SyntaxTree*>::const_iterator ConstIterator; 00044 00046 00050 00053 SyntaxTree(); 00054 00057 SyntaxTree(const char* predicate_name, const char* args); 00058 00061 SyntaxTree(SyntaxTree* left, SyntaxTree* right, ExpressionTree::Type type); 00062 00065 virtual ~SyntaxTree(); 00066 00068 00071 00076 virtual void clear(); 00077 00079 00083 00086 Iterator begin(); 00087 00090 Iterator end(); 00091 00094 ConstIterator begin() const; 00095 00098 ConstIterator end() const; 00099 00101 00105 void dump(std::ostream& is = std::cout, Size depth = 0) const; 00107 00113 String expression; 00114 00117 String predicate; 00118 00121 String argument; 00122 00125 bool evaluated; 00126 00129 bool negate; 00130 00133 ExpressionTree::Type type; 00134 00137 list<SyntaxTree*> children; 00139 }; 00140 00141 00145 00147 ExpressionParser(); 00148 00150 ExpressionParser(const ExpressionParser& parser); 00151 00153 ~ExpressionParser(); 00155 00159 00163 void parse(const String& s); 00164 00168 const SyntaxTree& getSyntaxTree() const; 00169 00171 00172 struct State 00173 { 00174 Size char_count; 00175 ExpressionParser* current_parser; 00176 const char* buffer; 00177 SyntaxTree* tree; 00178 }; 00179 00180 static State state; 00181 00182 protected: 00183 SyntaxTree* syntax_tree_; 00184 static ExpressionParser* current_parser_; 00185 }; 00186 } // namespace BALL 00187 00188 #endif // BALL_KERNEL_EXPRESSIONPARSER_H