summaryrefslogtreecommitdiff
path: root/old/cocorepo/Expressions.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'old/cocorepo/Expressions.hpp')
-rw-r--r--old/cocorepo/Expressions.hpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/old/cocorepo/Expressions.hpp b/old/cocorepo/Expressions.hpp
new file mode 100644
index 0000000..59e90a5
--- /dev/null
+++ b/old/cocorepo/Expressions.hpp
@@ -0,0 +1,147 @@
+#ifndef EXPRESSIONS_H_
+#define EXPRESSIONS_H_
+
+#include <string>
+#include <map>
+#include <iostream>
+
+using namespace std;
+
+typedef enum {
+ PREDICATE,
+ NOT,
+ AND,
+ OR
+} ExprType;
+
+class Expression {
+ public:
+ virtual bool evaluate( ) = 0;
+ virtual void print( ostream& o ) = 0;
+ virtual ExprType type( ) = 0;
+};
+
+class NotExpression : public Expression {
+ private:
+ Expression *expr;
+
+ public:
+ NotExpression( Expression *_expr )
+ : expr( _expr ) {
+ }
+
+ virtual bool evaluate( ) {
+ return !expr->evaluate( );
+ }
+
+ virtual void print( ostream& o ) {
+ bool is_parent = ( expr->type( ) == AND || expr->type( ) == OR );
+ if( is_parent ) o << "(";
+ o << "NOT ";
+ expr->print( o );
+ if( is_parent ) o << ")";
+ }
+
+ virtual ExprType type( ) {
+ return NOT;
+ }
+};
+
+class AndExpression : public Expression {
+ private:
+ Expression *expr;
+ Expression *right;
+
+ public:
+ AndExpression( Expression *_expr, Expression *_right ) :
+ expr( _expr ), right( _right ) {
+ }
+
+ virtual bool evaluate( ) {
+ return expr->evaluate( ) && right->evaluate( );
+ }
+
+ virtual void print( ostream& o ) {
+ bool is_parent = ( expr->type( ) == OR );
+ if( is_parent ) o << "(";
+ expr->print( o );
+ if( is_parent ) o << ")";
+
+ o << " AND ";
+
+ is_parent = ( expr->type( ) == OR );
+ if( is_parent ) o << "(";
+ right->print( o );
+ if( is_parent ) o << ")";
+ }
+
+ virtual ExprType type( ) {
+ return AND;
+ }
+};
+
+class OrExpression : public Expression {
+ private:
+ Expression *expr;
+ Expression *right;
+
+ public:
+ OrExpression( Expression *_expr, Expression *_right ) :
+ expr( _expr ), right( _right ) {
+ }
+
+ virtual bool evaluate( ) {
+ return expr->evaluate( ) || right->evaluate( );
+ }
+
+ virtual void print( ostream& o ) {
+ expr->print( o );
+ o << " OR ";
+ right->print( o );
+ }
+
+ virtual ExprType type( ) {
+ return OR;
+ }
+};
+
+class Predicate : public Expression {
+ private:
+ string ident;
+
+ public:
+ Predicate( const string _ident )
+ : ident( _ident ) {
+ }
+
+ virtual bool evaluate( ) {
+ return false;
+ }
+
+ virtual void print( ostream& o ) {
+ o << ident;
+ }
+
+ virtual ExprType type( ) {
+ return PREDICATE;
+ }
+};
+
+class Expressions : public Expression {
+ private:
+ typedef map<string,bool> valueMap;
+ valueMap values;
+
+ public:
+ Expressions( Expression *expr ) {
+ }
+
+ void setValue( const string ident, const bool value ) {
+ values[ident] = value;
+ }
+
+ virtual bool evaluate( ) {
+ }
+};
+
+#endif