Mercurial > hg > octave-nkf
diff src/parse.y @ 1829:7d2982b55242
[project @ 1996-02-02 14:12:59 by jwe]
author | jwe |
---|---|
date | Fri, 02 Feb 1996 14:13:13 +0000 |
parents | b14829582cc4 |
children | e62277bf5fe0 |
line wrap: on
line diff
--- a/src/parse.y +++ b/src/parse.y @@ -1,4 +1,5 @@ -/* parse.y -*- text -*- +// parse.y -*- text -*- +/* Copyright (C) 1992, 1993, 1994, 1995 John W. Eaton @@ -62,14 +63,6 @@ // Temporary symbol table pointer used to cope with bogus function syntax. symbol_table *tmp_local_sym_tab = 0; -// Stack to hold list of literal matrices. -SLStack <tree_matrix *> ml; - -// A nonzero element corresponding to an element of ml means we just -// started reading a new matrix. This should probably be part of a -// new struct for matrix lists... -SLStack <int> mlnm; - // The current input line number. int input_line_number = 0; @@ -148,7 +141,7 @@ // Build a for command a different way. static tree_command *make_for_command - (token *for_tok, tree_expression *expr, + (token *for_tok, tree_matrix_row *mr, tree_expression *expr, tree_statement_list *body, token *end_tok); // Build a break command. @@ -178,7 +171,7 @@ // Make an expression that handles assignment of multiple values. static tree_expression *make_multi_val_ret - (tree_expression *rhs, token *eq_tok); + (tree_matrix_row *mr, tree_expression *rhs, token *eq_tok); // Begin defining a function. static tree_function *start_function_def @@ -199,11 +192,8 @@ static tree_index_expression *make_index_expression (tree_indirect_ref *indir, tree_argument_list *args); -// Start building a matrix list. -static void start_matrix (tree_expression *expr); - // Finish building a matrix list. -static tree_expression *finish_matrix (void); +static tree_expression *finish_matrix (tree_matrix *m); // Maybe print a warning. Duh. static void maybe_warn_missing_semi (tree_statement_list *); @@ -231,6 +221,8 @@ // Types for the nonterminals we generate. tree *tree_type; + tree_matrix *tree_matrix_type; + tree_matrix_row *tree_matrix_row_type; tree_expression *tree_expression_type; tree_constant *tree_constant_type; tree_identifier *tree_identifier_type; @@ -289,6 +281,8 @@ // Nonterminals we construct. %type <tree_type> input +%type <tree_matrix_type> rows rows1 +%type <tree_matrix_row_type> matrix_row matrix_row1 %type <tree_expression_type> expression simple_expr simple_expr1 %type <tree_expression_type> ans_expression title matrix %type <tree_identifier_type> identifier @@ -449,6 +443,7 @@ { tree_statement *tmp = $1->rear (); tmp->set_print_flag (0); + $$ = $1; } ; @@ -521,7 +516,10 @@ | plot_command2 { $$ = new subplot_list ($1); } | plot_command1 ',' plot_command2 - { $1->append ($3); } + { + $1->append ($3); + $$ = $1; + } ; plot_command2 : expression @@ -612,7 +610,10 @@ global_decl1 : global_decl2 { $$ = new tree_global_init_list ($1); } | global_decl1 optcomma global_decl2 - { $1->append ($3); } + { + $1->append ($3); + $$ = $1; + } global_decl2 : identifier { $$ = new tree_global ($1); } @@ -668,7 +669,7 @@ | FOR '[' screwed_again matrix_row SCREW_TWO '=' expression optsep opt_list END { - if (! ($$ = make_for_command ($1, $7, $9, $10))) + if (! ($$ = make_for_command ($1, $4, $7, $9, $10))) ABORT_PARSE; } | BREAK @@ -698,13 +699,19 @@ if_cmd_list : if_cmd_list1 { $$ = $1 } | if_cmd_list1 else_clause - { $1->append ($2); } + { + $1->append ($2); + $$ = $1; + } ; if_cmd_list1 : expression optsep opt_list { $$ = start_if_command ($1, $3); } | if_cmd_list1 elseif_clause - { $1->append ($2); } + { + $1->append ($2); + $$ = $1; + } ; elseif_clause : ELSEIF optsep expression optsep opt_list @@ -769,15 +776,9 @@ | matrix { $$ = $1; } | '[' ']' - { - mlnm.pop (); - $$ = new tree_constant (Matrix ()); - } + { $$ = new tree_constant (Matrix ()); } | '[' ';' ']' - { - mlnm.pop (); - $$ = new tree_constant (Matrix ()); - } + { $$ = new tree_constant (Matrix ()); } | colon_expr { $$ = finish_colon_expression ($1); } | PLUS_PLUS identifier %prec UNARY @@ -794,7 +795,7 @@ { $$ = make_simple_assignment ($1, $2, $3); } | '[' screwed_again matrix_row SCREW_TWO '=' simple_expr { - if (! ($$ = make_multi_val_ret ($6, $5))) + if (! ($$ = make_multi_val_ret ($3, $6, $5))) ABORT_PARSE; } | identifier PLUS_PLUS @@ -879,6 +880,7 @@ { tree_constant *tmp = make_constant (TEXT, $2); $1->append (tmp); + $$ = $1; } ; @@ -945,10 +947,14 @@ | return_list_x error { yyerror ("invalid function return list"); + $$ = 0; ABORT_PARSE; } | return_list1 ',' identifier - { $1->append ($3); } + { + $1->append ($3); + $$ = $1; + } ; func_def2 : identifier safe local_symtab func_def3 @@ -967,7 +973,7 @@ fcn_end_or_eof : END { if (check_end ($1, token::function_end)) - ABORT_PARSE; + ABORT_PARSE; if (reading_fcn_file) check_for_garbage_after_fcn_def (); @@ -1026,27 +1032,34 @@ { lexer_flags.quote_is_transpose = 0; $1->mark_as_formal_parameters (); + $$ = $1; } | param_list1 ',' ELLIPSIS ')' { lexer_flags.quote_is_transpose = 0; $1->mark_as_formal_parameters (); $1->mark_varargs (); + $$ = $1; } ; param_list1 : '(' identifier { $$ = new tree_parameter_list ($2); } | param_list1 ',' identifier - { $1->append ($3); } + { + $1->append ($3); + $$ = $1; + } | '(' error { yyerror ("invalid parameter list"); + $$ = 0; ABORT_PARSE; } | param_list1 ',' error { yyerror ("invalid parameter list"); + $$ = 0; ABORT_PARSE; } ; @@ -1080,41 +1093,54 @@ tree_constant::magic_colon t; colon = new tree_constant (t); $1->append (colon); + $$ = $1; } | arg_list ',' expression - { $1->append ($3); } + { + $1->append ($3); + $$ = $1; + } | arg_list ',' ALL_VA_ARGS { tree_constant *all_va_args; tree_constant::all_va_args t; all_va_args = new tree_constant (t); $1->append (all_va_args); + $$ = $1; } ; matrix : '[' screwed_again rows ']' - { $$ = finish_matrix (); } + { $$ = finish_matrix ($3); } ; rows : rows1 + { $$ = $1; } | rows1 ';' // Ignore trailing semicolon. + { $$ = $1; } ; rows1 : matrix_row + { $$ = new tree_matrix ($1); } | rows1 ';' matrix_row + { + $1->append ($3); + $$ = $1; + } ; matrix_row : matrix_row1 + { $$ = $1; } | matrix_row1 ',' // Ignore trailing comma. + { $$ = $1; } ; matrix_row1 : expression // First element on row. - { start_matrix ($1); } + { $$ = new tree_matrix_row ($1); } | matrix_row1 ',' expression { - tree_matrix *tmp = ml.pop (); - tmp = tmp->chain ($3, tree_matrix::md_right); - ml.push (tmp); + $1->append ($3); + $$ = $1; } ; @@ -1704,8 +1730,9 @@ // Build a for command a different way. static tree_command * -make_for_command (token *for_tok, tree_expression *expr, - tree_statement_list *body, token *end_tok) +make_for_command (token *for_tok, tree_matrix_row *mr, + tree_expression *expr, tree_statement_list *body, + token *end_tok) { tree_command *retval = 0; @@ -1713,9 +1740,7 @@ { lexer_flags.looping--; - tree_matrix *tmp = ml.pop (); - tmp = tmp->reverse (); - tree_return_list *id_list = tmp->to_return_list (); + tree_return_list *id_list = mr->to_return_list (); int l = for_tok->line (); int c = for_tok->column (); @@ -1842,7 +1867,7 @@ // Make an expression that handles assignment of multiple values. static tree_expression * -make_multi_val_ret (tree_expression *rhs, token *eq_tok) +make_multi_val_ret (tree_matrix_row *mr, tree_expression *rhs, token *eq_tok) { // Convert the matrix list to a list of identifiers. If that fails, // we can abort here, without losing anything -- no other possible @@ -1853,11 +1878,7 @@ lexer_flags.maybe_screwed_again--; - tree_matrix *tmp = ml.pop (); - - tmp = tmp->reverse (); - - tree_return_list *id_list = tmp->to_return_list (); + tree_return_list *id_list = mr->to_return_list (); if (id_list) { @@ -2013,52 +2034,26 @@ return retval; } -// Start building a matrix list. - -void -start_matrix (tree_expression *expr) -{ - if (mlnm.top ()) - { - mlnm.pop (); - mlnm.push (0); - tree_matrix *tmp = new tree_matrix (expr, tree_matrix::md_none); - ml.push (tmp); - } - else - { - tree_matrix *tmp = ml.pop (); - tmp = tmp->chain (expr, tree_matrix::md_down); - ml.push (tmp); - } -} - // Finish building a matrix list. static tree_expression * -finish_matrix (void) +finish_matrix (tree_matrix *m) { tree_expression *retval = 0; - mlnm.pop (); - lexer_flags.maybe_screwed_again--; - tree_matrix *list = ml.pop (); - - list = list->reverse (); + if (m->is_matrix_constant ()) + { + tree_constant tmp = m->eval (0); - if (list->is_matrix_constant ()) - { - tree_constant tmp = list->eval (0); - - delete list; + delete m; if (! error_state) retval = new tree_constant (tmp); } else - retval = list; + retval = m; return retval; }