00001
00002
00003
00004
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 }
00187
00188 #endif // BALL_KERNEL_EXPRESSIONPARSER_H