Mercurial > hg > octave-nkf
diff src/parse.y @ 2960:194b50e4725b
[project @ 1997-05-12 00:43:54 by jwe]
author | jwe |
---|---|
date | Mon, 12 May 1997 00:54:04 +0000 |
parents | 0d79a8c11a2b |
children | 8a77d52c9d02 |
line wrap: on
line diff
--- a/src/parse.y +++ b/src/parse.y @@ -141,14 +141,10 @@ // Build a prefix expression. static tree_expression *make_prefix_op - (int op, tree_identifier *op1, token *tok_val); + (int op, tree_expression *op1, token *tok_val); // Build a postfix expression. static tree_expression *make_postfix_op - (int op, tree_identifier *op1, token *tok_val); - -// Build a binary expression. -static tree_expression *make_unary_op (int op, tree_expression *op1, token *tok_val); // Build an unwind-protect command. @@ -343,7 +339,7 @@ // Nonterminals we construct. %type <sep_type> sep_no_nl opt_sep_no_nl sep opt_sep %type <tree_type> input -%type <tree_constant_type> magic_colon +%type <tree_constant_type> constant magic_colon %type <tree_matrix_type> rows rows1 %type <tree_matrix_row_type> matrix_row matrix_row1 %type <tree_expression_type> expression simple_expr simple_expr1 @@ -773,17 +769,18 @@ } ; -simple_expr1 : NUM +constant : NUM { $$ = make_constant (NUM, $1); } | IMAG_NUM { $$ = make_constant (IMAG_NUM, $1); } | TEXT { $$ = make_constant (TEXT, $1); } + ; + +simple_expr1 : constant + { $$ = $1; } | '(' simple_expr ')' - { - $2->mark_in_parens (); - $$ = $2; - } + { $$ = $2->mark_in_parens (); } | word_list_cmd { $$ = $1; } | variable @@ -796,16 +793,16 @@ { $$ = new tree_constant (octave_value (Matrix ())); } | '[' ';' ']' { $$ = new tree_constant (octave_value (Matrix ())); } - | PLUS_PLUS identifier %prec UNARY + | PLUS_PLUS simple_expr %prec UNARY { $$ = make_prefix_op (PLUS_PLUS, $2, $1); } - | MINUS_MINUS identifier %prec UNARY + | MINUS_MINUS simple_expr %prec UNARY { $$ = make_prefix_op (MINUS_MINUS, $2, $1); } - | EXPR_NOT simple_expr - { $$ = make_unary_op (EXPR_NOT, $2, $1); } + | EXPR_NOT simple_expr %prec UNARY + { $$ = make_prefix_op (EXPR_NOT, $2, $1); } | '+' simple_expr %prec UNARY { $$ = $2; } | '-' simple_expr %prec UNARY - { $$ = make_unary_op ('-', $2, $1); } + { $$ = make_prefix_op ('-', $2, $1); } | variable '=' simple_expr { $$ = make_assign_op ('=', $1, $2, $3); } | variable ADD_EQ simple_expr @@ -829,18 +826,15 @@ | variable OR_EQ simple_expr { $$ = make_assign_op (OR_EQ, $1, $2, $3); } | '[' screwed_again matrix_row SCREW_TWO '=' simple_expr - { - if (! ($$ = make_multi_val_ret ($3, $6, $5))) - ABORT_PARSE; - } - | identifier PLUS_PLUS + { $$ = make_multi_val_ret ($3, $6, $5); } + | simple_expr PLUS_PLUS { $$ = make_postfix_op (PLUS_PLUS, $1, $2); } - | identifier MINUS_MINUS + | simple_expr MINUS_MINUS { $$ = make_postfix_op (MINUS_MINUS, $1, $2); } | simple_expr QUOTE - { $$ = make_unary_op (QUOTE, $1, $2); } + { $$ = make_postfix_op (QUOTE, $1, $2); } | simple_expr TRANSPOSE - { $$ = make_unary_op (TRANSPOSE, $1, $2); } + { $$ = make_postfix_op (TRANSPOSE, $1, $2); } | simple_expr POW simple_expr { $$ = make_binary_op (POW, $1, $2, $3); } | simple_expr EPOW simple_expr @@ -1521,48 +1515,6 @@ 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 (); - - 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 * @@ -1792,12 +1744,20 @@ // Build a prefix expression. static tree_expression * -make_prefix_op (int op, tree_identifier *op1, token *tok_val) +make_prefix_op (int op, tree_expression *op1, token *tok_val) { tree_prefix_expression::type t; switch (op) { + case EXPR_NOT: + t = tree_prefix_expression::unot; + break; + + case '-': + t = tree_prefix_expression::uminus; + break; + case PLUS_PLUS: t = tree_prefix_expression::increment; break; @@ -1814,18 +1774,26 @@ int l = tok_val->line (); int c = tok_val->column (); - return new tree_prefix_expression (op1, l, c, t); + return new tree_prefix_expression (t, op1, l, c); } // Build a postfix expression. static tree_expression * -make_postfix_op (int op, tree_identifier *op1, token *tok_val) +make_postfix_op (int op, tree_expression *op1, token *tok_val) { tree_postfix_expression::type t; switch (op) { + case QUOTE: + t = tree_postfix_expression::hermitian; + break; + + case TRANSPOSE: + t = tree_postfix_expression::transpose; + break; + case PLUS_PLUS: t = tree_postfix_expression::increment; break; @@ -1842,46 +1810,7 @@ int l = tok_val->line (); int c = tok_val->column (); - return new tree_postfix_expression (op1, l, c, t); -} - -// Build a unary expression. - -static tree_expression * -make_unary_op (int op, tree_expression *op1, token *tok_val) -{ - tree_unary_expression::type t; - - switch (op) - { - case QUOTE: - t = tree_unary_expression::hermitian; - break; - - case TRANSPOSE: - t = tree_unary_expression::transpose; - break; - - case EXPR_NOT: - t = tree_unary_expression::unot; - break; - - case '-': - t = tree_unary_expression::uminus; - break; - - default: - panic_impossible (); - break; - } - - int l = tok_val->line (); - int c = tok_val->column (); - - tree_unary_expression *e - = new tree_unary_expression (op1, l, c, t); - - return fold (e); + return new tree_postfix_expression (t, op1, l, c); } // Build an unwind-protect command.