diff src/pt-exp.h @ 2980:cd5ad3fd8049

[project @ 1997-05-16 01:12:13 by jwe]
author jwe
date Fri, 16 May 1997 01:13:19 +0000
parents a3556d2adec9
children daa1ed1f5462
line wrap: on
line diff
--- a/src/pt-exp.h	Thu May 15 22:36:40 1997 +0000
+++ b/src/pt-exp.h	Fri May 16 01:13:19 1997 +0000
@@ -20,421 +20,119 @@
 
 */
 
-#if !defined (octave_tree_expr2_h)
-#define octave_tree_expr2_h 1
+#if !defined (octave_tree_expr_h)
+#define octave_tree_expr_h 1
 
 #if defined (__GNUG__)
 #pragma interface
 #endif
 
-class ostream;
-
-class tree_identifier;
-class tree_index_expression;
-class tree_indirect_ref;
-class tree_argument_list;
-class tree_assignment_lhs;
-
-class tree_walker;
+#include <string>
 
 class octave_value;
-class octave_value_list;
 class octave_lvalue;
 
-#include "oct-obj.h"
-#include "pt-exp-base.h"
-
-// Unary expressions.
-
-class
-tree_unary_expression : public tree_expression
-{
-public:
-
-  tree_unary_expression (int l = -1, int c = -1)
-    : tree_expression (l, c), op (0)  { }
-
-  tree_unary_expression (tree_expression *e, int l = -1, int c = -1)
-    : tree_expression (l, c), op (e) { }
-
-  ~tree_unary_expression (void) { delete op; }
-
-  tree_expression *operand (void) { return op; }
-
-protected:
-
-  // The operand for the expression.
-  tree_expression *op;
-};
-
-// Prefix expressions.
-
-class
-tree_prefix_expression : public tree_unary_expression
-{
-public:
+#include "pt-base.h"
 
-  enum type
-    {
-      unknown,
-      unot,
-      uminus,
-      increment,
-      decrement
-    };
-
-  tree_prefix_expression (int l = -1, int c = -1)
-    : tree_unary_expression (l, c), etype (unknown) { }
-
-  tree_prefix_expression (type t = unknown, tree_expression *e,
-			  int l = -1, int c = -1)
-    : tree_unary_expression (e, l, c), etype (t) { }
-
-  ~tree_prefix_expression (void) { }
-
-  bool rvalue_ok (void) const
-    { return true; }
-
-  octave_value rvalue (void);
-
-  octave_value_list rvalue (int nargou);
-
-  void eval_error (void);
-
-  string oper (void) const;
-
-  void accept (tree_walker& tw);
-
-private:
-
-  // The type of the expression.
-  type etype;
-};
-
-// Postfix expressions.
+// A base class for expressions.
 
 class
-tree_postfix_expression : public tree_unary_expression
-{
-public:
-
-  enum type
-    {
-      unknown,
-      hermitian,
-      transpose,
-      increment,
-      decrement
-    };
-
-  tree_postfix_expression (int l = -1, int c = -1)
-    : tree_unary_expression (l, c), etype (unknown) { }
-
-  tree_postfix_expression (type t = unknown, tree_expression *e,
-			   int l = -1, int c = -1)
-    : tree_unary_expression (e, l, c), etype (t) { }
-
-  ~tree_postfix_expression (void) { }
-
-  bool rvalue_ok (void) const
-    { return true; }
-
-  octave_value rvalue (void);
-
-  octave_value_list rvalue (int nargout);
-
-  void eval_error (void);
-
-  string oper (void) const;
-
-  void accept (tree_walker& tw);
-
-private:
-
-  // The type of the expression.
-  type etype;
-};
-
-// Binary expressions.
-
-class
-tree_binary_expression : public tree_expression
-{
-public:
-
-  tree_binary_expression (int l = -1, int c = -1,
-			  octave_value::binary_op t
-			    = octave_value::unknown_binary_op)
-    : tree_expression (l, c), op_lhs (0), op_rhs (0), etype (t) { }
-
-  tree_binary_expression (tree_expression *a, tree_expression *b,
-			  int l = -1, int c = -1,
-			  octave_value::binary_op t
-			    = octave_value::unknown_binary_op)
-    : tree_expression (l, c), op_lhs (a), op_rhs (b), etype (t) { }
-
-  ~tree_binary_expression (void)
-    {
-      delete op_lhs;
-      delete op_rhs;
-    }
-
-  bool rvalue_ok (void) const
-    { return true; }
-
-  octave_value rvalue (void);
-
-  octave_value_list rvalue (int nargou);
-
-  void eval_error (void);
-
-  string oper (void) const;
-
-  tree_expression *lhs (void) { return op_lhs; }
-  tree_expression *rhs (void) { return op_rhs; }
-
-  void accept (tree_walker& tw);
-
-protected:
-
-  // The operands for the expression.
-  tree_expression *op_lhs;
-  tree_expression *op_rhs;
-
-private:
-
-  // The type of the expression.
-  octave_value::binary_op etype;
-};
-
-// Boolean expressions.
-
-class
-tree_boolean_expression : public tree_binary_expression
+tree_expression : public tree
 {
 public:
 
-  enum type
-    {
-      unknown,
-      bool_and,
-      bool_or
-    };
+  tree_expression (int l = -1, int c = -1)
+    : tree (l, c), num_parens (0), postfix_indexed (false),
+      print_flag (false) { }
 
-  tree_boolean_expression (int l = -1, int c = -1, type t = unknown)
-    : tree_binary_expression (l, c), etype (t) { }
+  virtual ~tree_expression (void) { }
 
-  tree_boolean_expression (tree_expression *a, tree_expression *b,
-			   int l = -1, int c = -1, type t = unknown)
-    : tree_binary_expression (a, b, l, c), etype (t) { }
-
-  ~tree_boolean_expression (void) { }
+  virtual bool is_constant (void) const
+    { return false; }
 
-  bool rvalue_ok (void) const
-    { return true; }
-
-  octave_value rvalue (void);
-
-  octave_value_list rvalue (int nargout);
-
-  string oper (void) const;
-
-private:
+  virtual bool is_matrix_constant (void) const
+    { return false; }
 
-  // The type of the expression.
-  type etype;
-};
+  virtual bool is_identifier (void) const
+    { return false; }
 
-// Simple assignment expressions.
-
-class
-tree_simple_assignment : public tree_expression
-{
-public:
+  virtual bool is_index_expression (void) const
+    { return false; }
 
-  tree_simple_assignment (bool plhs = false, int l = -1, int c = -1,
-			  octave_value::assign_op t = octave_value::asn_eq)
-    : tree_expression (l, c), lhs (0), rhs (0), preserve (plhs), etype (t) { }
+  virtual bool is_indirect_ref (void) const
+    { return false; }
 
-  tree_simple_assignment (tree_expression *le, tree_expression *re,
-			  bool plhs = false, int l = -1, int c = -1,
-			  octave_value::assign_op t = octave_value::asn_eq)
-    : tree_expression (l, c), lhs (le), rhs (re), preserve (plhs),
-      etype (t) { }
+  virtual bool is_assignment_expression (void) const
+    { return false; }
 
-  ~tree_simple_assignment (void);
+  virtual bool is_prefix_expression (void) const
+    { return false; }
 
-  bool rvalue_ok (void) const
-    { return true; }
-
-  octave_value rvalue (void);
+  virtual bool is_logically_true (const char *);
 
-  octave_value_list rvalue (int nargout);
-
-  bool is_assignment_expression (void) const
-    { return true; }
+  virtual bool lvalue_ok (void) const
+    { return false; }
 
-  void eval_error (void);
-
-  string oper (void) const;
-
-  tree_expression *left_hand_side (void) { return lhs; }
-
-  tree_expression *right_hand_side (void) { return rhs; }
+  virtual bool rvalue_ok (void) const
+    { return false; }
 
-  void accept (tree_walker& tw);
+  virtual octave_value rvalue (void);
 
-private:
-
-  void do_assign (octave_lvalue& ult, const octave_value_list& args,
-		  const octave_value& rhs_val);
+  virtual octave_value_list rvalue (int nargout);
 
-  void do_assign (octave_lvalue& ult, const octave_value& rhs_val);
+  virtual octave_lvalue lvalue (void);
 
-  // The left hand side of the assignment.
-  tree_expression *lhs;
-
-  // The right hand side of the assignment.
-  tree_expression *rhs;
+  int paren_count (void) const
+    { return num_parens; }
 
-  // True if we should not delete the lhs.
-  bool preserve;
-
-  // True if this is an assignment to the built-in variable ans.
-  bool ans_ass;
+  bool is_postfix_indexed (void) const
+    { return postfix_indexed; }
 
-  // The type of the expression.
-  octave_value::assign_op etype;
-};
+  bool print_result (void) const
+    { return print_flag; }
 
-// Colon expressions.
+  virtual string oper (void) const
+    { return "<unknown>"; }
 
-class
-tree_colon_expression : public tree_expression
-{
-public:
+  virtual string name (void) const
+    { return "<unknown>"; }
 
-  tree_colon_expression (int l = -1, int c = -1)
-    : tree_expression (l, c), op_base (0), op_limit (0), op_increment (0) { }
+  virtual string original_text (void) const;
 
-  tree_colon_expression (tree_expression *e, int l = -1, int c = -1)
-    : tree_expression (l, c), op_base (e), op_limit (0), op_increment (0) { }
-
-  ~tree_colon_expression (void)
+  tree_expression *mark_in_parens (void)
     {
-      delete op_base;
-      delete op_limit;
-      delete op_increment;
+      num_parens++;
+      return this;
     }
 
-  tree_colon_expression *append (tree_expression *t);
-
-  bool rvalue_ok (void) const
-    { return true; }
-
-  octave_value rvalue (void);
-
-  octave_value_list rvalue (int nargout);
-
-  void eval_error (const string& s = string ());
-
-  tree_expression *base (void) { return op_base; }
-  tree_expression *limit (void) { return op_limit; }
-  tree_expression *increment (void) { return op_increment; }
-
-  void accept (tree_walker& tw);
-
-private:
-
-  // The components of the expression.
-  tree_expression *op_base;
-  tree_expression *op_limit;
-  tree_expression *op_increment;
-};
-
-// Index expressions.
+  tree_expression *mark_postfix_indexed (void)
+    {
+      postfix_indexed = true;
+      return this;
+    }
 
-class
-tree_index_expression : public tree_expression
-{
-public:
-
-  tree_index_expression (tree_expression *e = 0, tree_argument_list *lst = 0,
-			 int l = -1, int c = -1)
-    : tree_expression (l, c), expr (e), list (lst), arg_nm () { }
-
-  ~tree_index_expression (void);
+  tree_expression *set_print_flag (bool print)
+    {
+      print_flag = print;
+      return this;
+    }
 
-  bool is_index_expression (void) const
-    { return true; }
-
-  tree_expression *expression (void)
-    { return expr; }
-
-  tree_argument_list *arg_list (void)
-    { return list; }
-
-  bool rvalue_ok (void) const
-    { return true; }
-
-  octave_value rvalue (void);
-
-  octave_value_list rvalue (int nargout);
+protected:
 
-  octave_lvalue lvalue (void);
-
-  void eval_error (void);
-
-  void accept (tree_walker& tw);
-
-private:
-
-  tree_expression *expr;
-
-  tree_argument_list *list;
-
-  string_vector arg_nm;
-};
-
-// Multi-valued assignment expressions.
-
-class
-tree_multi_assignment : public tree_expression
-{
-public:
-
-  tree_multi_assignment (bool plhs = false, int l = -1, int c = -1)
-    : tree_expression (l, c), preserve (plhs), lhs (0), rhs (0) { }
+  // A count of the number of times this expression appears directly
+  // inside a set of parentheses.
+  //
+  //   (((e1)) + e2)  ==> 2 for expression e1
+  //                  ==> 1 for expression ((e1)) + e2
+  //                  ==> 0 for expression e2
+  int num_parens;
 
-  tree_multi_assignment (tree_argument_list *lst, tree_expression *r,
-			 bool plhs = false, int l = -1, int c = -1)
-    : tree_expression (l, c), preserve (plhs), lhs (lst), rhs (r) { }
-
-  ~tree_multi_assignment (void);
-
-  bool is_assignment_expression (void) const
-    { return true; }
-
-  bool rvalue_ok (void) const
-    { return true; }
-
-  octave_value rvalue (void);
+  // A flag that says whether this expression has an index associated
+  // with it.  See the code in tree_identifier::rvalue for the rationale.
+  bool postfix_indexed;
 
-  octave_value_list rvalue (int nargout);
-
-  void eval_error (void);
-
-  tree_argument_list *left_hand_side (void) { return lhs; }
-
-  tree_expression *right_hand_side (void) { return rhs; }
-
-  void accept (tree_walker& tw);
-
-private:
-
-  bool preserve;
-  tree_argument_list *lhs;
-  tree_expression *rhs;
+  // Print result of rvalue for this expression?
+  bool print_flag;
 };
 
 #endif