00001 #ifndef NODE_IMPL_HPP_
00002 #define NODE_IMPL_HPP_
00003
00004 #include <cstdlib>
00005 #include <string>
00006
00007 #include "node.hpp"
00008
00019 class node_impl {
00020 public:
00021 node_impl();
00022 virtual ~node_impl();
00023
00024 void print(std::ostream& stream, int indent) const;
00025
00026 number evaluate() const;
00027
00028 std::string to_string() const;
00029
00030 identifier_list const& get_parameters() const;
00031
00032 void add_ref();
00033 void del_ref();
00034
00035 void save(std::ostream& stream) const;
00036
00038 static node_impl* read_node(std::istream& stream);
00039 private:
00040 node_impl(node_impl const& n);
00041 node_impl& operator=(node_impl const& n);
00042
00043 virtual void print_node(std::ostream& stream, int indent) const = 0;
00044 virtual number evaluate_node() const = 0;
00045 virtual std::string evaluate_string() const;
00046 virtual identifier_list const& evaluate_parameters() const;
00047 virtual void save_node(std::ostream& stream) const = 0;
00048
00049 std::size_t refcount_;
00050 };
00051
00055 class node_void : public node_impl {
00056 public:
00057 node_void();
00058 node_void(std::istream& stream);
00059 private:
00060 virtual void print_node(std::ostream& stream, int indent) const;
00061 virtual number evaluate_node() const;
00062 virtual std::string evaluate_string() const;
00063 virtual void save_node(std::ostream& stream) const;
00064 };
00065
00069 class node_number : public node_impl {
00070 public:
00071 node_number(number value);
00072 node_number(std::istream& stream);
00073 number value() const;
00074 private:
00075 virtual void print_node(std::ostream& stream, int indent) const;
00076 virtual number evaluate_node() const;
00077 virtual void save_node(std::ostream& stream) const;
00078
00079 number value_;
00080 };
00081
00085 class node_identifier : public node_impl {
00086 public:
00087 node_identifier(std::string const& name);
00088 node_identifier(std::istream& stream);
00089 std::string const& name() const;
00090 private:
00091 virtual void print_node(std::ostream& stream, int indent) const;
00092 virtual number evaluate_node() const;
00093 virtual std::string evaluate_string() const;
00094 virtual void save_node(std::ostream& stream) const;
00095
00096 std::string name_;
00097 };
00098
00102 class node_function : public node_impl {
00103 public:
00104 node_function(identifier_list const& parameters, node definition);
00105 node_function(std::istream& stream);
00106 identifier_list const& parameters() const;
00107 node definition() const;
00108 private:
00109 virtual void print_node(std::ostream& stream, int indent) const;
00110 virtual number evaluate_node() const;
00111 virtual identifier_list const& evaluate_parameters() const;
00112 virtual void save_node(std::ostream& stream) const;
00113
00114 identifier_list parameters_;
00115 node definition_;
00116 };
00117
00119 class node_function_call : public node_impl {
00120 public:
00121 node_function_call(std::string const& name, node_list const& arguments);
00122 node_function_call(std::istream& stream);
00123 std::string name() const;
00124 node_list const& arguments() const;
00125 private:
00126 virtual void print_node(std::ostream& stream, int indent) const;
00127 virtual number evaluate_node() const;
00128 virtual void save_node(std::ostream& stream) const;
00129
00130 std::string name_;
00131 node_list arguments_;
00132 };
00133
00135 class node_unary : public node_impl {
00136 public:
00137 node_unary(node operand);
00138 node operand() const;
00139 protected:
00140 node_unary(std::istream& stream);
00141 number evaluate_operand() const;
00142 private:
00143 virtual void print_node(std::ostream& stream, int indent) const = 0;
00144 virtual number evaluate_node() const = 0;
00145 virtual void save_node(std::ostream& stream) const = 0;
00146
00147 node operand_;
00148 };
00149
00151 class node_binary : public node_impl {
00152 public:
00153 node_binary(node left, node right);
00154 node left() const;
00155 node right() const;
00156 protected:
00157 node_binary(std::istream& stream);
00158 number evaluate_left() const;
00159 number evaluate_right() const;
00160 private:
00161 virtual void print_node(std::ostream& stream, int indent) const = 0;
00162 virtual number evaluate_node() const = 0;
00163 virtual void save_node(std::ostream& stream) const = 0;
00164
00165 node left_;
00166 node right_;
00167 };
00168
00170 class node_negate : public node_unary {
00171 public:
00172 node_negate(node operand);
00173 node_negate(std::istream& stream);
00174 private:
00175 virtual void print_node(std::ostream& stream, int indent) const;
00176 virtual number evaluate_node() const;
00177 virtual void save_node(std::ostream& stream) const;
00178 };
00179
00181 class node_add : public node_binary {
00182 public:
00183 node_add(node left, node right);
00184 node_add(std::istream& stream);
00185 private:
00186 virtual void print_node(std::ostream& stream, int indent) const;
00187 virtual number evaluate_node() const;
00188 virtual void save_node(std::ostream& stream) const;
00189 };
00190
00192 class node_subtract : public node_binary {
00193 public:
00194 node_subtract(node left, node right);
00195 node_subtract(std::istream& stream);
00196 private:
00197 virtual void print_node(std::ostream& stream, int indent) const;
00198 virtual number evaluate_node() const;
00199 virtual void save_node(std::ostream& stream) const;
00200 };
00201
00203 class node_multiply : public node_binary {
00204 public:
00205 node_multiply(node left, node right);
00206 node_multiply(std::istream& stream);
00207 private:
00208 virtual void print_node(std::ostream& stream, int indent) const;
00209 virtual number evaluate_node() const;
00210 virtual void save_node(std::ostream& stream) const;
00211 };
00212
00214 class node_divide : public node_binary {
00215 public:
00216 node_divide(node left, node right);
00217 node_divide(std::istream& stream);
00218 private:
00219 virtual void print_node(std::ostream& stream, int indent) const;
00220 virtual number evaluate_node() const;
00221 virtual void save_node(std::ostream& stream) const;
00222 };
00223
00224 #endif