# HG changeset patch # User jwe # Date 812347697 0 # Node ID 893b416bb919fc6af8cbd257f5e9087b8e3c42c7 # Parent 4d6c168ff23541b50d7ac96da17c984f5c92e68f [project @ 1995-09-29 04:03:01 by jwe] diff -r 4d6c168ff235 -r 893b416bb919 src/parse.y --- a/src/parse.y Fri Sep 29 03:59:46 1995 +0000 +++ b/src/parse.y Fri Sep 29 04:08:17 1995 +0000 @@ -221,7 +221,9 @@ %token END %token PLOT %token TEXT STYLE -%token FOR WHILE IF ELSEIF ELSE BREAK CONTINUE FUNC_RET +%token FOR WHILE +%token IF ELSEIF ELSE +%token BREAK CONTINUE FUNC_RET %token UNWIND CLEANUP %token TRY CATCH %token GLOBAL diff -r 4d6c168ff235 -r 893b416bb919 src/pt-cmd.cc --- a/src/pt-cmd.cc Fri Sep 29 03:59:46 1995 +0000 +++ b/src/pt-cmd.cc Fri Sep 29 04:08:17 1995 +0000 @@ -142,50 +142,12 @@ if (error_state) return; + if (! expr) + panic_impossible (); + for (;;) { - int expr_value = 0; - if (! expr) - return; - tree_constant t1 = expr->eval (0); - - if (error_state) - { - eval_error (); - return; - } - - if (t1.rows () == 0 || t1.columns () == 0) - { - int flag = user_pref.propagate_empty_matrices; - if (flag < 0) - warning ("while: empty matrix used in conditional"); - else if (flag == 0) - { - ::error ("empty matrix used in while condition near line\ - %d, column %d", line (), column ()); - return; - } - t1 = tree_constant (0.0); - } - else if (! t1.is_scalar_type ()) - { - tree_constant t2 = t1.all (); - t1 = t2.all (); - } - - if (t1.is_real_scalar ()) - expr_value = (int) t1.double_value (); - else if (t1.is_complex_scalar ()) - expr_value = t1.complex_value () != 0.0; - else - { - ::error ("invalid type used in while condition near line %d,\ - column %d", line (), column ()); - return; - } - - if (expr_value) + if (expr->is_logically_true ("while")) { if (list) { diff -r 4d6c168ff235 -r 893b416bb919 src/pt-exp-base.cc --- a/src/pt-exp-base.cc Fri Sep 29 03:59:46 1995 +0000 +++ b/src/pt-exp-base.cc Fri Sep 29 04:08:17 1995 +0000 @@ -181,6 +181,67 @@ // Expressions. +int +tree_expression::is_logically_true (const char *warn_for) +{ + int expr_value = 0; + + tree_constant t1 = eval (0); + + if (error_state) + { +// XXX FIXME XXX +// +// eval_error (); +// + return expr_value; + } + + if (t1.is_undefined ()) + { + ::error ("%s: undefined value used in conditional expression\ + near line %d, column %d", warn_for, line (), column ()); + return expr_value; + } + + if (t1.rows () == 0 || t1.columns () == 0) + { + int flag = user_pref.propagate_empty_matrices; + if (flag < 0) + warning ("%s: empty matrix used in conditional expression\ + near line %d, column %d", warn_for, line (), column ()); + else if (flag == 0) + { + ::error ("%s: empty matrix used in conditional expression\ + near line %d, column %d", warn_for, line (), column ()); + return expr_value; + } + t1 = 0.0; + } + else if (! t1.is_scalar_type ()) + { + tree_constant t2 = t1.all (); + if (! error_state) + t1 = t2.all (); + + if (error_state) + { + ::error ("%s: invalid type in conditional expression near\ + line %d, column %d", warn_for, line (), column ()); + return expr_value; + } + } + + if (t1.is_real_scalar ()) + expr_value = (int) t1.double_value (); + else if (t1.is_complex_scalar ()) + expr_value = t1.complex_value () != 0.0; + else + panic_impossible (); + + return expr_value; +} + tree_constant tree_expression::eval (int /* print */) { diff -r 4d6c168ff235 -r 893b416bb919 src/pt-exp-base.h --- a/src/pt-exp-base.h Fri Sep 29 03:59:46 1995 +0000 +++ b/src/pt-exp-base.h Fri Sep 29 04:08:17 1995 +0000 @@ -138,6 +138,8 @@ virtual int is_prefix_expression (void) const { return 0; } + virtual int is_logically_true (const char *); + virtual void mark_for_possible_ans_assign (void) { panic_impossible (); } diff -r 4d6c168ff235 -r 893b416bb919 src/pt-misc.cc --- a/src/pt-misc.cc Fri Sep 29 03:59:46 1995 +0000 +++ b/src/pt-misc.cc Fri Sep 29 04:08:17 1995 +0000 @@ -510,57 +510,9 @@ // If. int -tree_if_clause::is_else_clause (void) -{ - return (! expr); -} - -int tree_if_clause::eval (void) { - if (expr) - { - tree_constant t1 = expr->eval (0); - - if (error_state || t1.is_undefined ()) - return 0; - - if (t1.rows () == 0 || t1.columns () == 0) - { - int flag = user_pref.propagate_empty_matrices; - if (flag < 0) - warning ("if: empty matrix used in conditional"); - else if (flag == 0) - { - ::error ("if: empty matrix used in conditional"); - return 0; - } - t1 = tree_constant (0.0); - } - else if (! t1.is_scalar_type ()) - { - tree_constant t2 = t1.all (); - t1 = t2.all (); - } - - int expr_value = 0; - - if (t1.is_real_scalar ()) - expr_value = (int) t1.double_value (); - else if (t1.is_complex_scalar ()) - expr_value = t1.complex_value () != 0.0; - else - error ("if: all (all (cond)) is not a scalar"); - - if (expr_value) - { - if (list) - list->eval (1); - - return 1; - } - } - else + if (is_else_clause () || expr->is_logically_true ("if")) { if (list) list->eval (1); diff -r 4d6c168ff235 -r 893b416bb919 src/pt-misc.h --- a/src/pt-misc.h Fri Sep 29 03:59:46 1995 +0000 +++ b/src/pt-misc.h Fri Sep 29 04:08:17 1995 +0000 @@ -313,23 +313,24 @@ tree_if_clause : public tree_print_code { public: - tree_if_clause (void) + tree_if_clause (void) : tree_print_code () { expr = 0; list = 0; } - tree_if_clause (tree_statement_list *l) - { - expr = 0; - list = l; - } + tree_if_clause (tree_statement_list *l) : tree_print_code () + { + expr = 0; + list = l; + } tree_if_clause (tree_expression *e, tree_statement_list *l) - { - expr = e; - list = l; - } + : tree_print_code () + { + expr = e; + list = l; + } ~tree_if_clause (void) { @@ -337,7 +338,10 @@ delete list; } - int is_else_clause (void); + int is_else_clause (void) + { + return ! expr; + } int eval (void);