# HG changeset patch # User jwe # Date 848427692 0 # Node ID 987e934bbb8ca48a2901278c6de5954e5ed0d13d # Parent 0e5eb97cb1378c06e31b3c809d2ca068382936a5 [project @ 1996-11-19 18:21:23 by jwe] diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,45 @@ +Tue Nov 19 12:01:13 1996 John W. Eaton + + * parse.y (fold): New functions for constant folding for binary + and unary expressions. Keep track of original text even when + transformations occur. + (make_binary_op, make_boolean_op, make_unary_op): Use them. + (finish_colon_expression, finish_matrix): Keep track of original + text even when transformations occur. + + * help.cc (Ftype): Don't mess with Vps4. + Handle new option `-transformed'. + + * pt-const.h, pt-const.cc (tree_constant::print): + New arg, pr_orig_text. + + * pt-exp.h, pt-exp.cc (tree_colon_expression::is_range_constant): + Delete. + + * pt-exp-base.h (tree_expression::original_text): New virtual function. + pt-exp-base.cc (tree_expression::original_text): Default version. + + * pt-pr-code.h (tree_print_code::print_original_text, + tree_print_code::prefix): New fields. + * pt-pr-code.cc (tree_print_code::visit_constant): Pass + print_original_text to tree_constant::print(). + (tree_print_code::indent): Use prefix instead of Vps4. + * pt-fcn.cc (tree_function::print_function_header, + tree_function::print_function_trailer): Pass Vps4 to + tree_print_code_constructor for prefix. + * pt-misc.cc (tree_statement::maybe_echo_code): Pass Vps4 to + tree_print_code_constructor for prefix. + + * pt-mat.h, pt-mat.cc (tree_matrix::all_elements_are_constant): + Rename from is_matrix_constant. + (tree_matrix_row::all_elements_are_constant): Likewise. + Change all callers. + +Mon Nov 18 14:13:32 1996 John W. Eaton + + * Makefile.in (install-inc): Try harder to create the link from + include/octave to include/octave-VERSION. + Sun Nov 17 14:14:48 1996 John W. Eaton * Makefile.in (parse.cc): Expect 13 shift/reduce conflicts. diff --git a/src/parse.y b/src/parse.y --- a/src/parse.y +++ b/src/parse.y @@ -56,6 +56,7 @@ #include "pt-exp.h" #include "pt-misc.h" #include "pt-plot.h" +#include "pt-pr-code.h" #include "symtab.h" #include "token.h" #include "utils.h" @@ -707,8 +708,6 @@ expression : simple_expr { $$ = $1; } - | colon_expr - { $$ = finish_colon_expression ($1); } | NUM '=' expression { yyerror ("invalid assignment to a number"); @@ -742,6 +741,8 @@ { $$ = $1; } | variable { $$ = $1; } + | colon_expr + { $$ = finish_colon_expression ($1); } | matrix { $$ = $1; } | '[' ']' @@ -1363,6 +1364,91 @@ return new tree_plot_command (list, range, tok->pttype ()); } +static tree_expression * +fold (tree_binary_expression *e) +{ + tree_expression *retval = 0; + + tree_expression *op1 = e->lhs (); + tree_expression *op2 = e->rhs (); + + if (op1->is_constant () && op2->is_constant ()) + { + octave_value tmp = e->eval (0); + + if (! error_state) + { + tree_constant *tc_retval = new tree_constant (tmp); + + ostrstream buf; + + tree_print_code tpc (buf); + + e->accept (tpc); + + buf << ends; + + char *s = buf.str (); + + tc_retval->stash_original_text (s); + + delete [] s; + + delete e; + + retval = tc_retval; + } + else + delete e; + } + else + retval = e; + + return retval; +} + +static tree_expression * +fold (tree_unary_expression *e) +{ + tree_expression *retval = 0; + + tree_expression *op1 = e->operand (); + + if (op1->is_constant ()) + { + octave_value tmp = e->eval (0); + + if (! error_state) + { + tree_constant *tc_retval = new tree_constant (tmp); + + ostrstream buf; + + tree_print_code tpc (buf); + + e->accept (tpc); + + buf << ends; + + char *s = buf.str (); + + tc_retval->stash_original_text (s); + + delete [] s; + + delete e; + + retval = tc_retval; + } + else + delete e; + } + else + retval = e; + + return retval; +} + // Finish building a range. static tree_expression * @@ -1370,14 +1456,39 @@ { tree_expression *retval = 0; - if (e->is_range_constant ()) + tree_expression *base = e->base (); + tree_expression *limit = e->limit (); + tree_expression *incr = e->increment (); + + if (base->is_constant () && limit->is_constant () + && (! incr || (incr && incr->is_constant ()))) { octave_value tmp = e->eval (0); - delete e; + if (! error_state) + { + tree_constant *tc_retval = new tree_constant (tmp); + + ostrstream buf; + + tree_print_code tpc (buf); + + e->accept (tpc); + + buf << ends; - if (! error_state) - retval = new tree_constant (tmp); + char *s = buf.str (); + + tc_retval->stash_original_text (s); + + delete [] s; + + delete e; + + retval = tc_retval; + } + else + delete e; } else retval = e; @@ -1398,8 +1509,10 @@ switch (op) { case NUM: - retval = new tree_constant (tok_val->number (), l, c); - retval->stash_original_text (tok_val->text_rep ()); + { + retval = new tree_constant (tok_val->number (), l, c); + retval->stash_original_text (tok_val->text_rep ()); + } break; case IMAG_NUM: @@ -1428,8 +1541,6 @@ make_binary_op (int op, tree_expression *op1, token *tok_val, tree_expression *op2) { - tree_expression *retval = 0; - tree_binary_expression::type t; switch (op) @@ -1514,20 +1625,10 @@ int l = tok_val->line (); int c = tok_val->column (); - retval = new tree_binary_expression (op1, op2, l, c, t); - - if (op1->is_constant () && op2->is_constant ()) - { - octave_value tmp = retval->eval (0); + tree_binary_expression *e + = new tree_binary_expression (op1, op2, l, c, t); - delete retval; - retval = 0; - - if (! error_state) - retval = new tree_constant (tmp); - } - - return retval; + return fold (e); } // Build a boolean expression. @@ -1536,8 +1637,6 @@ make_boolean_op (int op, tree_expression *op1, token *tok_val, tree_expression *op2) { - tree_expression *retval = 0; - tree_boolean_expression::type t; switch (op) @@ -1558,20 +1657,10 @@ int l = tok_val->line (); int c = tok_val->column (); - retval = new tree_boolean_expression (op1, op2, l, c, t); - - if (op1->is_constant () && op2->is_constant ()) - { - octave_value tmp = retval->eval (0); + tree_boolean_expression *e + = new tree_boolean_expression (op1, op2, l, c, t); - delete retval; - retval = 0; - - if (! error_state) - retval = new tree_constant (tmp); - } - - return retval; + return fold (e); } // Build a prefix expression. @@ -1635,8 +1724,6 @@ static tree_expression * make_unary_op (int op, tree_expression *op1, token *tok_val) { - tree_expression *retval = 0; - tree_unary_expression::type t; switch (op) @@ -1665,20 +1752,10 @@ int l = tok_val->line (); int c = tok_val->column (); - retval = new tree_unary_expression (op1, l, c, t); - - if (op1->is_constant ()) - { - octave_value tmp = retval->eval (0); + tree_unary_expression *e + = new tree_unary_expression (op1, l, c, t); - delete retval; - retval = 0; - - if (! error_state) - retval = new tree_constant (tmp); - } - - return retval; + return fold (e); } // Build an unwind-protect command. @@ -2080,14 +2157,34 @@ lexer_flags.maybe_screwed_again--; - if (m->is_matrix_constant ()) + if (m->all_elements_are_constant ()) { octave_value tmp = m->eval (0); - delete m; + if (! error_state) + { + tree_constant *tc_retval = new tree_constant (tmp); + + ostrstream buf; + + tree_print_code tpc (buf); + + m->accept (tpc); + + buf << ends; - if (! error_state) - retval = new tree_constant (tmp); + char *s = buf.str (); + + tc_retval->stash_original_text (s); + + delete [] s; + + delete m; + + retval = tc_retval; + } + else + delete m; } else retval = m;