# HG changeset patch # User jwe # Date 863400984 0 # Node ID 8a77d52c9d02dde4f3d5c30eb5f980864307f7f0 # Parent 194b50e4725bb26dcb48e275ae06112f59db8c9b [project @ 1997-05-12 01:36:04 by jwe] diff -r 194b50e4725b -r 8a77d52c9d02 src/parse.y --- a/src/parse.y Mon May 12 00:54:04 1997 +0000 +++ b/src/parse.y Mon May 12 01:36:24 1997 +0000 @@ -1427,7 +1427,7 @@ { if (Vwarn_assign_as_truth_value && expr->is_assignment_expression () - && expr->is_in_parens () < 2) + && expr->paren_count () < 2) { warning ("suggest parenthesis around assignment used as truth value"); } diff -r 194b50e4725b -r 8a77d52c9d02 src/pt-exp-base.h --- a/src/pt-exp-base.h Mon May 12 00:54:04 1997 +0000 +++ b/src/pt-exp-base.h Mon May 12 01:36:24 1997 +0000 @@ -42,7 +42,7 @@ public: tree_expression (int l = -1, int c = -1) - : tree (l, c), in_parens (0) { } + : tree (l, c), num_parens (0) { } virtual ~tree_expression (void) { } @@ -72,7 +72,8 @@ virtual bool is_logically_true (const char *); - virtual bool is_in_parens (void) { return in_parens; } + virtual int paren_count (void) const + { return num_parens; } virtual void mark_for_possible_ans_assign (void); @@ -80,16 +81,26 @@ virtual octave_variable_reference reference (void); - virtual string oper (void) const { return ""; } + virtual string oper (void) const + { return ""; } virtual string original_text (void) const; - expression *mark_in_parens (void) { in_parens++; return this; } + tree_expression *mark_in_parens (void) + { + num_parens++; + return this; + } protected: - // Nonzero if this expression appears inside parentheses. - int in_parens; + // 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; }; #endif diff -r 194b50e4725b -r 8a77d52c9d02 src/pt-pr-code.cc --- a/src/pt-pr-code.cc Mon May 12 00:54:04 1997 +0000 +++ b/src/pt-pr-code.cc Mon May 12 01:36:24 1997 +0000 @@ -70,10 +70,7 @@ { indent (); - bool in_parens = expr.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (expr, "("); tree_expression *op1 = expr.lhs (); @@ -87,8 +84,7 @@ if (op2) op2->accept (*this); - if (in_parens) - os << ")"; + print_parens (expr, ")"); } void @@ -104,10 +100,7 @@ { indent (); - bool in_parens = expr.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (expr, "("); tree_expression *op1 = expr.base (); @@ -132,8 +125,7 @@ op2->accept (*this); } - if (in_parens) - os << ")"; + print_parens (expr, ")"); } void @@ -333,16 +325,12 @@ { indent (); - bool in_parens = id.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (id, "("); string nm = id.name (); os << (nm.empty () ? string ("(empty)") : nm); - if (in_parens) - os << ")"; + print_parens (id, ")"); } void @@ -420,10 +408,7 @@ { indent (); - bool in_parens = expr.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (expr, "("); tree_indirect_ref *id = expr.ident (); @@ -439,8 +424,7 @@ os << ")"; } - if (in_parens) - os << ")"; + print_parens (expr, ")"); } void @@ -448,18 +432,14 @@ { indent (); - bool in_parens = expr.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (expr, "("); // The name of the indirect ref includes the sub-elements. string nm = expr.name (); os << (nm.empty () ? string ("(empty)") : nm); - if (in_parens) - os << ")"; + print_parens (expr, ")"); } void @@ -467,10 +447,7 @@ { indent (); - bool in_parens = lst.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (lst, "("); os << "["; @@ -493,8 +470,7 @@ os << "]"; - if (in_parens) - os << ")"; + print_parens (lst, ")"); } void @@ -524,10 +500,7 @@ { indent (); - bool in_parens = expr.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (expr, "("); tree_return_list *lhs = expr.left_hand_side (); @@ -551,8 +524,7 @@ if (rhs) rhs->accept (*this); - if (in_parens) - os << ")"; + print_parens (expr, ")"); } void @@ -574,15 +546,11 @@ { indent (); - bool in_parens = val.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (val, "("); val.print_raw (os, true, print_original_text); - if (in_parens) - os << ")"; + print_parens (val, ")"); } void @@ -687,10 +655,7 @@ { indent (); - bool in_parens = expr.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (expr, "("); tree_expression *e = expr.operand (); @@ -699,8 +664,7 @@ os << expr.oper (); - if (in_parens) - os << ")"; + print_parens (expr, ")"); } void @@ -708,10 +672,7 @@ { indent (); - bool in_parens = expr.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (expr, "("); os << expr.oper (); @@ -720,8 +681,7 @@ if (e) e->accept (*this); - if (in_parens) - os << ")"; + print_parens (expr, ")"); } void @@ -759,10 +719,7 @@ { indent (); - bool in_parens = expr.is_in_parens (); - - if (in_parens) - os << "("; + print_parens (expr, "("); if (! expr.is_ans_assign ()) { @@ -788,8 +745,7 @@ if (rhs) rhs->accept (*this); - if (in_parens) - os << ")"; + print_parens (expr, ")"); } void @@ -1158,6 +1114,15 @@ curr_print_indent_level = 0; } +void +tree_print_code::print_parens (const tree_expression& expr, const char *txt) +{ + int n = expr.paren_count (); + + for (int i = 0; i < n; i++) + os << txt; +} + /* ;;; Local Variables: *** ;;; mode: C++ *** diff -r 194b50e4725b -r 8a77d52c9d02 src/pt-pr-code.h --- a/src/pt-pr-code.h Mon May 12 00:54:04 1997 +0000 +++ b/src/pt-pr-code.h Mon May 12 01:36:24 1997 +0000 @@ -31,6 +31,8 @@ #include "pt-walk.h" +class tree_expression; + // How to print the code that the parse trees represent. class @@ -160,6 +162,8 @@ void reset (void); + void print_parens (const tree_expression& expr, const char *txt); + // Must create with an output stream! tree_print_code (void);