#ifndef EXPR_HH #define EXPR_HH #include "permstr.hh" #include "logic.hh" class ConstExpr: public Logic { double _v; public: ConstExpr(double v) : _v(v) { } double calculate(Vector &, Vehicle *) { return _v; } void print(); }; class BinaryExpr: public Logic { Logic *_left; int _op; Logic *_right; double calculate_assign(double, Vector &, Vehicle *); public: BinaryExpr(Logic *l, int op, Logic *r) : _left(l), _op(op), _right(r) { } Logic *left() const { return _left; } int op() const { return _op; } Logic *right() const { return _right; } double calculate(Vector &, Vehicle *); void draw(Vehicle *, int, View *); void print(); BinaryExpr *cast_binary_expr() { return this; } }; class UnaryExpr: public Logic { int _op; Logic *_child; public: UnaryExpr(int op, Logic *c) : _op(op), _child(c) { } double calculate(Vector &, Vehicle *); void draw(Vehicle *, int, View *); void print(); }; class ConditionalExpr: public Logic { Logic *_test; Logic *_true_case; Logic *_false_case; public: ConditionalExpr(Logic *q, Logic *t, Logic *f) : _test(q), _true_case(t), _false_case(f) { } double calculate(Vector &, Vehicle *); void draw(Vehicle *, int, View *); void print(); }; class SensorExpr: public Logic { PermString _name; public: SensorExpr(PermString name) : _name(name) { } PermString name() const { return _name; } double calculate(Vector &, Vehicle *); void draw(Vehicle *, int, View *); void print(); SensorExpr *cast_sensor_expr() { return this; } }; class BoundExpr: public Logic { int _number; public: BoundExpr(int number) : _number(number) { } int lvalue(Vehicle *); double calculate(Vector &, Vehicle *); void draw(Vehicle *, int, View *); void print(); }; #endif