00001 // -*- Mode: C++; tab-width: 2; -*- 00002 // vi: set ts=2: 00003 // 00004 // $Id: expressionParser.h,v 1.13 2005/10/23 12:02:18 oliver Exp $ 00005 // 00006 00007 #ifndef BALL_KERNEL_EXPRESSIONPARSER_H 00008 #define BALL_KERNEL_EXPRESSIONPARSER_H 00009 00010 #ifndef BALL_KERNEL_EXPRESSION_TREE_H 00011 # include <BALL/KERNEL/expressionTree.h> 00012 #endif 00013 00014 namespace BALL 00015 { 00016 00024 class BALL_EXPORT ExpressionParser 00025 { 00026 public: 00027 00033 class BALL_EXPORT SyntaxTree 00034 { 00035 public: 00036 00040 00042 typedef list<SyntaxTree*>::iterator Iterator; 00043 00045 typedef list<SyntaxTree*>::const_iterator ConstIterator; 00046 00048 00052 00055 SyntaxTree(); 00056 00059 SyntaxTree(const char* predicate_name, const char* args); 00060 00063 SyntaxTree(SyntaxTree* left, SyntaxTree* right, ExpressionTree::Type type); 00064 00067 virtual ~SyntaxTree(); 00068 00070 00073 00078 virtual void clear(); 00079 00081 00085 00088 Iterator begin(); 00089 00092 Iterator end(); 00093 00096 ConstIterator begin() const; 00097 00100 ConstIterator end() const; 00101 00103 00107 void dump(std::ostream& is = std::cout, Size depth = 0) const; 00109 00115 String expression; 00116 00119 String predicate; 00120 00123 String argument; 00124 00127 bool evaluated; 00128 00131 bool negate; 00132 00135 ExpressionTree::Type type; 00136 00139 list<SyntaxTree*> children; 00141 }; 00142 00143 00147 00149 ExpressionParser(); 00150 00152 ExpressionParser(const ExpressionParser& parser); 00153 00155 ~ExpressionParser(); 00157 00163 void parse(const String& s) 00164 throw(Exception::ParseError); 00165 00168 const SyntaxTree& getSyntaxTree() const 00169 throw(Exception::NullPointer); 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