Mercurial > hg > octave-lyh
diff src/pt-exp.cc @ 2388:4be11abb8d8c
[project @ 1996-10-12 18:53:51 by jwe]
author | jwe |
---|---|
date | Sat, 12 Oct 1996 18:54:13 +0000 |
parents | 6abec42e52f6 |
children | d21eb2d6e135 |
line wrap: on
line diff
--- a/src/pt-exp.cc +++ b/src/pt-exp.cc @@ -38,11 +38,12 @@ #include "input.h" #include "oct-obj.h" #include "pager.h" -#include "pt-const.h" +#include "ov.h" #include "pt-exp.h" #include "pt-fvc.h" #include "pt-misc.h" #include "pt-mvr.h" +#include "pt-pr-code.h" #include "pt-walk.h" #include "utils.h" @@ -69,7 +70,22 @@ if (id) { - id->bump_value (etype); + switch (etype) + { + case increment: + id->increment (); + break; + + case decrement: + id->decrement (); + break; + + default: + error ("prefix operator %d not implemented", etype); + break; + } + + if (error_state) eval_error (); else @@ -92,11 +108,11 @@ static char *op; switch (etype) { - case tree_expression::increment: + case increment: op = "++"; break; - case tree_expression::decrement: + case decrement: op = "--"; break; @@ -143,7 +159,22 @@ if (id) { retval = id->eval (print); - id->bump_value (etype); + + switch (etype) + { + case increment: + id->increment (); + break; + + case decrement: + id->decrement (); + break; + + default: + error ("postfix operator %d not implemented", etype); + break; + } + if (error_state) { retval = octave_value (); @@ -160,11 +191,11 @@ static char *op; switch (etype) { - case tree_expression::increment: + case increment: op = "++"; break; - case tree_expression::decrement: + case decrement: op = "--"; break; @@ -198,38 +229,48 @@ octave_value tree_unary_expression::eval (bool /* print */) { - if (error_state) - return octave_value (); - octave_value retval; - switch (etype) + if (error_state) + return retval; + + if (op) { - case tree_expression::not: - case tree_expression::uminus: - case tree_expression::hermitian: - case tree_expression::transpose: - if (op) + octave_value u = op->eval (false); + + if (error_state) + eval_error (); + else if (u.is_defined ()) { - octave_value u = op->eval (false); + switch (etype) + { + case not: + retval = u.not (); + break; + + case uminus: + retval = u.uminus (); + break; + + case transpose: + retval = u.transpose (); + break; + + case hermitian: + retval = u.hermitian (); + break; + + default: + ::error ("unary operator %d not implemented", etype); + break; + } + if (error_state) - eval_error (); - else if (u.is_defined ()) { - retval = do_unary_op (u, etype); - if (error_state) - { - retval = octave_value (); - if (error_state) - eval_error (); - } + retval = octave_value (); + eval_error (); } } - break; - - default: - ::error ("unary operator %d not implemented", etype); - break; } return retval; @@ -241,20 +282,20 @@ static char *op; switch (etype) { - case tree_expression::not: + case not: op = "!"; break; - case tree_expression::uminus: + case uminus: op = "-"; break; - case tree_expression::hermitian: - op = "'"; + case transpose: + op = ".'"; break; - case tree_expression::transpose: - op = ".'"; + case hermitian: + op = "'"; break; default: @@ -287,118 +328,122 @@ octave_value tree_binary_expression::eval (bool /* print */) { - if (error_state) - return octave_value (); - octave_value retval; - switch (etype) + if (error_state) + return retval; + + if (op_lhs) { - case tree_expression::add: - case tree_expression::subtract: - case tree_expression::multiply: - case tree_expression::el_mul: - case tree_expression::divide: - case tree_expression::el_div: - case tree_expression::leftdiv: - case tree_expression::el_leftdiv: - case tree_expression::power: - case tree_expression::elem_pow: - case tree_expression::cmp_lt: - case tree_expression::cmp_le: - case tree_expression::cmp_eq: - case tree_expression::cmp_ge: - case tree_expression::cmp_gt: - case tree_expression::cmp_ne: - case tree_expression::and: - case tree_expression::or: - if (op_lhs) + octave_value a = op_lhs->eval (false); + + if (error_state) + eval_error (); + else if (a.is_defined () && op_rhs) { - octave_value a = op_lhs->eval (false); + octave_value b = op_rhs->eval (false); + if (error_state) eval_error (); - else if (a.is_defined () && op_rhs) + else if (b.is_defined ()) { - octave_value b = op_rhs->eval (false); - if (error_state) - eval_error (); - else if (b.is_defined ()) + octave_value::binary_op op = octave_value::unknown_binary_op; + + switch (etype) { - retval = do_binary_op (a, b, etype); - if (error_state) - { - retval = octave_value (); - if (error_state) - eval_error (); - } + case add: + op = octave_value::add; + break; + + case subtract: + op = octave_value::sub; + break; + + case multiply: + op = octave_value::mul; + break; + + case el_mul: + op = octave_value::el_mul; + break; + + case divide: + op = octave_value::div; + break; + + case el_div: + op = octave_value::el_div; + break; + + case leftdiv: + op = octave_value::ldiv; + break; + + case el_leftdiv: + op = octave_value::el_ldiv; + break; + + case power: + op = octave_value::pow; + break; + + case elem_pow: + op = octave_value::el_pow; + break; + + case cmp_lt: + op = octave_value::lt; + break; + + case cmp_le: + op = octave_value::le; + break; + + case cmp_eq: + op = octave_value::eq; + break; + + case cmp_ge: + op = octave_value::ge; + break; + + case cmp_gt: + op = octave_value::gt; + break; + + case cmp_ne: + op = octave_value::ne; + break; + + case and: + op = octave_value::el_and; + break; + + case or: + op = octave_value::el_or; + break; + + default: + ::error ("binary operator %d not implemented", etype); + break; + } + + if (! error_state) + retval = ::do_binary_op (op, a, b); + else + { + retval = octave_value (); + eval_error (); } } + else + eval_error (); } - break; - - case tree_expression::and_and: - case tree_expression::or_or: - { - bool result = false; - if (op_lhs) - { - octave_value a = op_lhs->eval (false); - if (error_state) - { - eval_error (); - break; - } - - bool a_true = a.is_true (); - if (error_state) - { - eval_error (); - break; - } - - if (a_true) - { - if (etype == tree_expression::or_or) - { - result = true; - goto done; - } - } - else - { - if (etype == tree_expression::and_and) - { - result = false; - goto done; - } - } - - if (op_rhs) - { - octave_value b = op_rhs->eval (false); - if (error_state) - { - eval_error (); - break; - } - - result = b.is_true (); - if (error_state) - { - eval_error (); - break; - } - } - } - done: - retval = octave_value ((double) result); - } - break; - - default: - ::error ("binary operator %d not implemented", etype); - break; + else + eval_error (); } + else + eval_error (); return retval; } @@ -409,83 +454,75 @@ static char *op; switch (etype) { - case tree_expression::add: + case add: op = "+"; break; - case tree_expression::subtract: + case subtract: op = "-"; break; - case tree_expression::multiply: + case multiply: op = "*"; break; - case tree_expression::el_mul: + case el_mul: op = ".*"; break; - case tree_expression::divide: + case divide: op = "/"; break; - case tree_expression::el_div: + case el_div: op = "./"; break; - case tree_expression::leftdiv: + case leftdiv: op = "\\"; break; - case tree_expression::el_leftdiv: + case el_leftdiv: op = ".\\"; break; - case tree_expression::power: + case power: op = "^"; break; - case tree_expression::elem_pow: + case elem_pow: op = ".^"; break; - case tree_expression::cmp_lt: + case cmp_lt: op = "<"; break; - case tree_expression::cmp_le: + case cmp_le: op = "<="; break; - case tree_expression::cmp_eq: + case cmp_eq: op = "=="; break; - case tree_expression::cmp_ge: + case cmp_ge: op = ">="; break; - case tree_expression::cmp_gt: + case cmp_gt: op = ">"; break; - case tree_expression::cmp_ne: + case cmp_ne: op = "!="; break; - case tree_expression::and_and: - op = "&&"; - break; - - case tree_expression::or_or: - op = "||"; - break; - - case tree_expression::and: + case and: op = "&"; break; - case tree_expression::or: + case or: op = "|"; break; @@ -504,7 +541,7 @@ char *op = oper (); ::error ("evaluating binary operator `%s' near line %d, column %d", - op, line (), column ()); + op, line (), column ()); } } @@ -514,6 +551,97 @@ tw.visit_binary_expression (*this); } +// Boolean expressions. + +octave_value +tree_boolean_expression::eval (bool /* print */) +{ + octave_value retval; + + if (error_state) + return retval; + + bool result = false; + + if (op_lhs) + { + octave_value a = op_lhs->eval (false); + + if (error_state) + eval_error (); + else + { + bool a_true = a.is_true (); + + if (error_state) + eval_error (); + else + { + if (a_true) + { + if (etype == or) + { + result = true; + goto done; + } + } + else + { + if (etype == and) + goto done; + } + + if (op_rhs) + { + octave_value b = op_rhs->eval (false); + + if (error_state) + eval_error (); + else + { + result = b.is_true (); + + if (error_state) + eval_error (); + } + } + else + eval_error (); + + done: + + if (! error_state) + retval = octave_value ((double) result); + } + } + } + else + eval_error (); + + return retval; +} + +char * +tree_boolean_expression::oper (void) const +{ + static char *op; + switch (etype) + { + case and: + op = "&&"; + break; + + case or: + op = "||"; + break; + + default: + op = "<unknown>"; + break; + } + return op; +} + // Simple assignment expressions. tree_simple_assignment_expression::tree_simple_assignment_expression @@ -563,6 +691,11 @@ return lhs->ident (); } +// ??? FIXME ??? -- should this return the value of the RHS instead? + +// ??? FIXME ??? -- should octave_variable_reference::assign return +// the right thing for us to return? + octave_value tree_simple_assignment_expression::eval (bool print) { @@ -585,31 +718,43 @@ error ("value on right hand side of assignment is undefined"); eval_error (); } - else if (! index) - { - retval = lhs->assign (rhs_val); - if (error_state) - eval_error (); - } else { - // Extract the arguments into a simple vector. - - octave_value_list args = index->convert_to_const_vector (); + octave_variable_reference ult (lhs); if (error_state) eval_error (); else { - int nargin = args.length (); + if (index) + { + // Extract the arguments into a simple vector. - if (error_state) - eval_error (); - else if (nargin > 0) - { - retval = lhs->assign (rhs_val, args); + octave_value_list args = index->convert_to_const_vector (); + if (error_state) eval_error (); + else + { + int nargin = args.length (); + + if (nargin > 0) + { + ult.assign (args, rhs_val); + + if (error_state) + eval_error (); + else + retval = ult.value (); + } + else + error ("??? invalid index list ???"); + } + } + else + { + ult.assign (rhs_val); + retval = ult.value (); } } }