Mercurial > hg > octave-nkf
changeset 16134:ec9c6222ef5a
move static parser helper functions to octave_parser class
* oct-parse.yy, parse.h (append_statement_list, end_error,
end_token_ok, finish_cell, finish_colon_expression, finish_function,
finish_if_command, finish_matrix, finish_switch_command,
frob_function, make_anon_fcn_handle, make_assign_op, make_binary_op,
make_boolean_op, make_break_command, make_constant,
make_continue_command, make_decl_command, make_do_until_command,
make_elseif_clause, make_end, make_fcn_handle, make_for_command,
make_index_expression, make_indirect_ref, make_postfix_op,
make_prefix_op, make_return_command, make_script,
make_statement_list, make_switch_case, make_try_command,
make_unwind_command, make_while_command,
maybe_warn_assign_as_truth_value, maybe_warn_missing_semi,
maybe_warn_variable_switch_label, recover_from_parsing_function,
set_stmt_print_flag, start_function, start_if_command,
validate_matrix_row): Declare as members of octave_parser class.
Change all callers.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 26 Feb 2013 21:04:40 -0500 |
parents | 249d62b3fac8 |
children | 98b211a163ce |
files | libinterp/parse-tree/oct-parse.yy libinterp/parse-tree/parse.h libinterp/parse-tree/token.h |
diffstat | 3 files changed, 467 insertions(+), 417 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/parse-tree/oct-parse.yy +++ b/libinterp/parse-tree/oct-parse.yy @@ -159,200 +159,6 @@ static void yyerror (const char *s); -// Error mesages for mismatched end tokens. -static void -end_error (const char *type, token::end_tok_type ettype, int l, int c); - -// Check to see that end tokens are properly matched. -static bool -end_token_ok (token *tok, token::end_tok_type expected); - -// Maybe print a warning if an assignment expression is used as the -// test in a logical expression. -static void -maybe_warn_assign_as_truth_value (tree_expression *expr); - -// Maybe print a warning about switch labels that aren't constants. -static void -maybe_warn_variable_switch_label (tree_expression *expr); - -// Finish building a range. -static tree_expression * -finish_colon_expression (tree_colon_expression *e); - -// Build a constant. -static tree_constant * -make_constant (int op, token *tok_val); - -// Build a function handle. -static tree_fcn_handle * -make_fcn_handle (token *tok_val); - -// Build an anonymous function handle. -static tree_anon_fcn_handle * -make_anon_fcn_handle (tree_parameter_list *param_list, tree_statement *stmt); - -// Build a binary expression. -static tree_expression * -make_binary_op (int op, tree_expression *op1, token *tok_val, - tree_expression *op2); - -// Build a boolean expression. -static tree_expression * -make_boolean_op (int op, tree_expression *op1, token *tok_val, - tree_expression *op2); - -// Build a prefix expression. -static tree_expression * -make_prefix_op (int op, tree_expression *op1, token *tok_val); - -// Build a postfix expression. -static tree_expression * -make_postfix_op (int op, tree_expression *op1, token *tok_val); - -// Build an unwind-protect command. -static tree_command * -make_unwind_command (token *unwind_tok, tree_statement_list *body, - tree_statement_list *cleanup, token *end_tok, - octave_comment_list *lc, octave_comment_list *mc); - -// Build a try-catch command. -static tree_command * -make_try_command (token *try_tok, tree_statement_list *body, - tree_statement_list *cleanup, token *end_tok, - octave_comment_list *lc, octave_comment_list *mc); - -// Build a while command. -static tree_command * -make_while_command (token *while_tok, tree_expression *expr, - tree_statement_list *body, token *end_tok, - octave_comment_list *lc); - -// Build a do-until command. -static tree_command * -make_do_until_command (token *until_tok, tree_statement_list *body, - tree_expression *expr, octave_comment_list *lc); - -// Build a for command. -static tree_command * -make_for_command (int tok_id, token *for_tok, tree_argument_list *lhs, - tree_expression *expr, tree_expression *maxproc, - tree_statement_list *body, token *end_tok, - octave_comment_list *lc); - -// Build a break command. -static tree_command * -make_break_command (token *break_tok); - -// Build a continue command. -static tree_command * -make_continue_command (token *continue_tok); - -// Build a return command. -static tree_command * -make_return_command (token *return_tok); - -// Start an if command. -static tree_if_command_list * -start_if_command (tree_expression *expr, tree_statement_list *list); - -// Finish an if command. -static tree_if_command * -finish_if_command (token *if_tok, tree_if_command_list *list, - token *end_tok, octave_comment_list *lc); - -// Build an elseif clause. -static tree_if_clause * -make_elseif_clause (token *elseif_tok, tree_expression *expr, - tree_statement_list *list, octave_comment_list *lc); - -// Finish a switch command. -static tree_switch_command * -finish_switch_command (token *switch_tok, tree_expression *expr, - tree_switch_case_list *list, token *end_tok, - octave_comment_list *lc); - -// Build a switch case. -static tree_switch_case * -make_switch_case (token *case_tok, tree_expression *expr, - tree_statement_list *list, octave_comment_list *lc); - -// Build an assignment to a variable. -static tree_expression * -make_assign_op (int op, tree_argument_list *lhs, token *eq_tok, - tree_expression *rhs); - -// Define a script. -static void -make_script (tree_statement_list *cmds, tree_statement *end_script); - -// Begin defining a function. -static octave_user_function * -start_function (tree_parameter_list *param_list, tree_statement_list *body, - tree_statement *end_function); - -// Create a no-op statement for end_function. -static tree_statement * -make_end (const std::string& type, int l, int c); - -// Do most of the work for defining a function. -static octave_user_function * -frob_function (const std::string& fname, octave_user_function *fcn); - -// Finish defining a function. -static tree_function_def * -finish_function (tree_parameter_list *ret_list, - octave_user_function *fcn, octave_comment_list *lc); - -// Reset state after parsing function. -static void -recover_from_parsing_function (void); - -// Make an index expression. -static tree_index_expression * -make_index_expression (tree_expression *expr, - tree_argument_list *args, char type); - -// Make an indirect reference expression. -static tree_index_expression * -make_indirect_ref (tree_expression *expr, const std::string&); - -// Make an indirect reference expression with dynamic field name. -static tree_index_expression * -make_indirect_ref (tree_expression *expr, tree_expression *field); - -// Make a declaration command. -static tree_decl_command * -make_decl_command (int tok, token *tok_val, tree_decl_init_list *lst); - -// Validate argument list forming a matrix or cell row. -static tree_argument_list * -validate_matrix_row (tree_argument_list *row); - -// Finish building a matrix list. -static tree_expression * -finish_matrix (tree_matrix *m); - -// Finish building a cell list. -static tree_expression * -finish_cell (tree_cell *c); - -// Maybe print a warning. Duh. -static void -maybe_warn_missing_semi (tree_statement_list *); - -// Set the print flag for a statement based on the separator type. -static tree_statement_list * -set_stmt_print_flag (tree_statement_list *, char, bool); - -// Create a statement list. -static tree_statement_list *make_statement_list (tree_statement *stmt); - -// Append a statement to an existing statement list. -static tree_statement_list * -append_statement_list (tree_statement_list *list, char sep, - tree_statement *stmt, bool warn_missing_semi); - // Finish building a statement. template <class T> static tree_statement * @@ -571,13 +377,13 @@ ; simple_list : simple_list1 opt_sep_no_nl - { $$ = set_stmt_print_flag ($1, $2, false); } + { $$ = curr_parser->set_stmt_print_flag ($1, $2, false); } ; simple_list1 : statement - { $$ = make_statement_list ($1); } + { $$ = curr_parser->make_statement_list ($1); } | simple_list1 sep_no_nl statement - { $$ = append_statement_list ($1, $2, $3, false); } + { $$ = curr_parser->append_statement_list ($1, $2, $3, false); } ; opt_list : // empty @@ -587,13 +393,13 @@ ; list : list1 opt_sep - { $$ = set_stmt_print_flag ($1, $2, true); } + { $$ = curr_parser->set_stmt_print_flag ($1, $2, true); } ; list1 : statement - { $$ = make_statement_list ($1); } + { $$ = curr_parser->make_statement_list ($1); } | list1 sep statement - { $$ = append_statement_list ($1, $2, $3, true); } + { $$ = curr_parser->append_statement_list ($1, $2, $3, true); } ; statement : expression @@ -613,7 +419,7 @@ // WHILE, etc. word_list_cmd : identifier word_list - { $$ = make_index_expression ($1, $2, '('); } + { $$ = curr_parser->make_index_expression ($1, $2, '('); } ; word_list : string @@ -646,15 +452,15 @@ ; string : DQ_STRING - { $$ = make_constant (DQ_STRING, $1); } + { $$ = curr_parser->make_constant (DQ_STRING, $1); } | SQ_STRING - { $$ = make_constant (SQ_STRING, $1); } + { $$ = curr_parser->make_constant (SQ_STRING, $1); } ; constant : NUM - { $$ = make_constant (NUM, $1); } + { $$ = curr_parser->make_constant (NUM, $1); } | IMAG_NUM - { $$ = make_constant (IMAG_NUM, $1); } + { $$ = curr_parser->make_constant (IMAG_NUM, $1); } | string { $$ = $1; } ; @@ -679,7 +485,7 @@ } | '[' matrix_rows ']' { - $$ = finish_matrix ($2); + $$ = curr_parser->finish_matrix ($2); curr_lexer->looking_at_matrix_or_assign_lhs = false; curr_lexer->pending_local_variables.clear (); } @@ -705,7 +511,7 @@ | '{' ';' '}' { $$ = new tree_constant (octave_value (Cell ())); } | '{' cell_rows '}' - { $$ = finish_cell ($2); } + { $$ = curr_parser->finish_cell ($2); } ; cell_rows : cell_rows1 @@ -725,14 +531,14 @@ cell_or_matrix_row : arg_list - { $$ = validate_matrix_row ($1); } + { $$ = curr_parser->validate_matrix_row ($1); } | arg_list ',' // Ignore trailing comma. - { $$ = validate_matrix_row ($1); } + { $$ = curr_parser->validate_matrix_row ($1); } ; fcn_handle : '@' FCN_HANDLE { - $$ = make_fcn_handle ($2); + $$ = curr_parser->make_fcn_handle ($2); curr_lexer->looking_at_function_handle--; } ; @@ -740,7 +546,7 @@ anon_fcn_handle : '@' param_list statement { curr_lexer->quote_is_transpose = false; - $$ = make_anon_fcn_handle ($2, $3); + $$ = curr_parser->make_anon_fcn_handle ($2, $3); } ; @@ -805,63 +611,63 @@ oper_expr : primary_expr { $$ = $1; } | oper_expr PLUS_PLUS - { $$ = make_postfix_op (PLUS_PLUS, $1, $2); } + { $$ = curr_parser->make_postfix_op (PLUS_PLUS, $1, $2); } | oper_expr MINUS_MINUS - { $$ = make_postfix_op (MINUS_MINUS, $1, $2); } + { $$ = curr_parser->make_postfix_op (MINUS_MINUS, $1, $2); } | oper_expr '(' ')' - { $$ = make_index_expression ($1, 0, '('); } + { $$ = curr_parser->make_index_expression ($1, 0, '('); } | oper_expr '(' arg_list ')' - { $$ = make_index_expression ($1, $3, '('); } + { $$ = curr_parser->make_index_expression ($1, $3, '('); } | oper_expr '{' '}' - { $$ = make_index_expression ($1, 0, '{'); } + { $$ = curr_parser->make_index_expression ($1, 0, '{'); } | oper_expr '{' arg_list '}' - { $$ = make_index_expression ($1, $3, '{'); } + { $$ = curr_parser->make_index_expression ($1, $3, '{'); } | oper_expr QUOTE - { $$ = make_postfix_op (QUOTE, $1, $2); } + { $$ = curr_parser->make_postfix_op (QUOTE, $1, $2); } | oper_expr TRANSPOSE - { $$ = make_postfix_op (TRANSPOSE, $1, $2); } + { $$ = curr_parser->make_postfix_op (TRANSPOSE, $1, $2); } | oper_expr indirect_ref_op STRUCT_ELT - { $$ = make_indirect_ref ($1, $3->text ()); } + { $$ = curr_parser->make_indirect_ref ($1, $3->text ()); } | oper_expr indirect_ref_op '(' expression ')' - { $$ = make_indirect_ref ($1, $4); } + { $$ = curr_parser->make_indirect_ref ($1, $4); } | PLUS_PLUS oper_expr %prec UNARY - { $$ = make_prefix_op (PLUS_PLUS, $2, $1); } + { $$ = curr_parser->make_prefix_op (PLUS_PLUS, $2, $1); } | MINUS_MINUS oper_expr %prec UNARY - { $$ = make_prefix_op (MINUS_MINUS, $2, $1); } + { $$ = curr_parser->make_prefix_op (MINUS_MINUS, $2, $1); } | EXPR_NOT oper_expr %prec UNARY - { $$ = make_prefix_op (EXPR_NOT, $2, $1); } + { $$ = curr_parser->make_prefix_op (EXPR_NOT, $2, $1); } | '+' oper_expr %prec UNARY - { $$ = make_prefix_op ('+', $2, $1); } + { $$ = curr_parser->make_prefix_op ('+', $2, $1); } | '-' oper_expr %prec UNARY - { $$ = make_prefix_op ('-', $2, $1); } + { $$ = curr_parser->make_prefix_op ('-', $2, $1); } | oper_expr POW oper_expr - { $$ = make_binary_op (POW, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (POW, $1, $2, $3); } | oper_expr EPOW oper_expr - { $$ = make_binary_op (EPOW, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EPOW, $1, $2, $3); } | oper_expr '+' oper_expr - { $$ = make_binary_op ('+', $1, $2, $3); } + { $$ = curr_parser->make_binary_op ('+', $1, $2, $3); } | oper_expr '-' oper_expr - { $$ = make_binary_op ('-', $1, $2, $3); } + { $$ = curr_parser->make_binary_op ('-', $1, $2, $3); } | oper_expr '*' oper_expr - { $$ = make_binary_op ('*', $1, $2, $3); } + { $$ = curr_parser->make_binary_op ('*', $1, $2, $3); } | oper_expr '/' oper_expr - { $$ = make_binary_op ('/', $1, $2, $3); } + { $$ = curr_parser->make_binary_op ('/', $1, $2, $3); } | oper_expr EPLUS oper_expr - { $$ = make_binary_op ('+', $1, $2, $3); } + { $$ = curr_parser->make_binary_op ('+', $1, $2, $3); } | oper_expr EMINUS oper_expr - { $$ = make_binary_op ('-', $1, $2, $3); } + { $$ = curr_parser->make_binary_op ('-', $1, $2, $3); } | oper_expr EMUL oper_expr - { $$ = make_binary_op (EMUL, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EMUL, $1, $2, $3); } | oper_expr EDIV oper_expr - { $$ = make_binary_op (EDIV, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EDIV, $1, $2, $3); } | oper_expr LEFTDIV oper_expr - { $$ = make_binary_op (LEFTDIV, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (LEFTDIV, $1, $2, $3); } | oper_expr ELEFTDIV oper_expr - { $$ = make_binary_op (ELEFTDIV, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (ELEFTDIV, $1, $2, $3); } ; colon_expr : colon_expr1 - { $$ = finish_colon_expression ($1); } + { $$ = curr_parser->finish_colon_expression ($1); } ; colon_expr1 : oper_expr @@ -876,29 +682,29 @@ simple_expr : colon_expr { $$ = $1; } | simple_expr LSHIFT simple_expr - { $$ = make_binary_op (LSHIFT, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (LSHIFT, $1, $2, $3); } | simple_expr RSHIFT simple_expr - { $$ = make_binary_op (RSHIFT, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (RSHIFT, $1, $2, $3); } | simple_expr EXPR_LT simple_expr - { $$ = make_binary_op (EXPR_LT, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EXPR_LT, $1, $2, $3); } | simple_expr EXPR_LE simple_expr - { $$ = make_binary_op (EXPR_LE, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EXPR_LE, $1, $2, $3); } | simple_expr EXPR_EQ simple_expr - { $$ = make_binary_op (EXPR_EQ, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EXPR_EQ, $1, $2, $3); } | simple_expr EXPR_GE simple_expr - { $$ = make_binary_op (EXPR_GE, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EXPR_GE, $1, $2, $3); } | simple_expr EXPR_GT simple_expr - { $$ = make_binary_op (EXPR_GT, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EXPR_GT, $1, $2, $3); } | simple_expr EXPR_NE simple_expr - { $$ = make_binary_op (EXPR_NE, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EXPR_NE, $1, $2, $3); } | simple_expr EXPR_AND simple_expr - { $$ = make_binary_op (EXPR_AND, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EXPR_AND, $1, $2, $3); } | simple_expr EXPR_OR simple_expr - { $$ = make_binary_op (EXPR_OR, $1, $2, $3); } + { $$ = curr_parser->make_binary_op (EXPR_OR, $1, $2, $3); } | simple_expr EXPR_AND_AND simple_expr - { $$ = make_boolean_op (EXPR_AND_AND, $1, $2, $3); } + { $$ = curr_parser->make_boolean_op (EXPR_AND_AND, $1, $2, $3); } | simple_expr EXPR_OR_OR simple_expr - { $$ = make_boolean_op (EXPR_OR_OR, $1, $2, $3); } + { $$ = curr_parser->make_boolean_op (EXPR_OR_OR, $1, $2, $3); } ; // Arrange for the lexer to return CLOSE_BRACE for ']' by looking ahead @@ -924,35 +730,35 @@ ; assign_expr : assign_lhs '=' expression - { $$ = make_assign_op ('=', $1, $2, $3); } + { $$ = curr_parser->make_assign_op ('=', $1, $2, $3); } | assign_lhs ADD_EQ expression - { $$ = make_assign_op (ADD_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (ADD_EQ, $1, $2, $3); } | assign_lhs SUB_EQ expression - { $$ = make_assign_op (SUB_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (SUB_EQ, $1, $2, $3); } | assign_lhs MUL_EQ expression - { $$ = make_assign_op (MUL_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (MUL_EQ, $1, $2, $3); } | assign_lhs DIV_EQ expression - { $$ = make_assign_op (DIV_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (DIV_EQ, $1, $2, $3); } | assign_lhs LEFTDIV_EQ expression - { $$ = make_assign_op (LEFTDIV_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (LEFTDIV_EQ, $1, $2, $3); } | assign_lhs POW_EQ expression - { $$ = make_assign_op (POW_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (POW_EQ, $1, $2, $3); } | assign_lhs LSHIFT_EQ expression - { $$ = make_assign_op (LSHIFT_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (LSHIFT_EQ, $1, $2, $3); } | assign_lhs RSHIFT_EQ expression - { $$ = make_assign_op (RSHIFT_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (RSHIFT_EQ, $1, $2, $3); } | assign_lhs EMUL_EQ expression - { $$ = make_assign_op (EMUL_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (EMUL_EQ, $1, $2, $3); } | assign_lhs EDIV_EQ expression - { $$ = make_assign_op (EDIV_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (EDIV_EQ, $1, $2, $3); } | assign_lhs ELEFTDIV_EQ expression - { $$ = make_assign_op (ELEFTDIV_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (ELEFTDIV_EQ, $1, $2, $3); } | assign_lhs EPOW_EQ expression - { $$ = make_assign_op (EPOW_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (EPOW_EQ, $1, $2, $3); } | assign_lhs AND_EQ expression - { $$ = make_assign_op (AND_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (AND_EQ, $1, $2, $3); } | assign_lhs OR_EQ expression - { $$ = make_assign_op (OR_EQ, $1, $2, $3); } + { $$ = curr_parser->make_assign_op (OR_EQ, $1, $2, $3); } ; expression : simple_expr @@ -995,12 +801,12 @@ declaration : GLOBAL parsing_decl_list decl1 { - $$ = make_decl_command (GLOBAL, $1, $3); + $$ = curr_parser->make_decl_command (GLOBAL, $1, $3); curr_lexer->looking_at_decl_list = false; } | PERSISTENT parsing_decl_list decl1 { - $$ = make_decl_command (PERSISTENT, $1, $3); + $$ = curr_parser->make_decl_command (PERSISTENT, $1, $3); curr_lexer->looking_at_decl_list = false; } ; @@ -1046,7 +852,7 @@ if_command : IF stash_comment if_cmd_list END { - if (! ($$ = finish_if_command ($1, $3, $4, $2))) + if (! ($$ = curr_parser->finish_if_command ($1, $3, $4, $2))) ABORT_PARSE; } ; @@ -1064,7 +870,7 @@ { $1->mark_braindead_shortcircuit (curr_fcn_file_full_name); - $$ = start_if_command ($1, $3); + $$ = curr_parser->start_if_command ($1, $3); } | if_cmd_list1 elseif_clause { @@ -1077,7 +883,7 @@ { $4->mark_braindead_shortcircuit (curr_fcn_file_full_name); - $$ = make_elseif_clause ($1, $4, $6, $2); + $$ = curr_parser->make_elseif_clause ($1, $4, $6, $2); } ; @@ -1091,7 +897,7 @@ switch_command : SWITCH stash_comment expression opt_sep case_list END { - if (! ($$ = finish_switch_command ($1, $3, $5, $6, $2))) + if (! ($$ = curr_parser->finish_switch_command ($1, $3, $5, $6, $2))) ABORT_PARSE; } ; @@ -1119,7 +925,7 @@ ; switch_case : CASE stash_comment opt_sep expression opt_sep opt_list - { $$ = make_switch_case ($1, $4, $6, $2); } + { $$ = curr_parser->make_switch_case ($1, $4, $6, $2); } ; default_case : OTHERWISE stash_comment opt_sep opt_list @@ -1136,35 +942,35 @@ { $3->mark_braindead_shortcircuit (curr_fcn_file_full_name); - if (! ($$ = make_while_command ($1, $3, $5, $6, $2))) + if (! ($$ = curr_parser->make_while_command ($1, $3, $5, $6, $2))) ABORT_PARSE; } | DO stash_comment opt_sep opt_list UNTIL expression { - if (! ($$ = make_do_until_command ($5, $4, $6, $2))) + if (! ($$ = curr_parser->make_do_until_command ($5, $4, $6, $2))) ABORT_PARSE; } | FOR stash_comment assign_lhs '=' expression opt_sep opt_list END { - if (! ($$ = make_for_command (FOR, $1, $3, $5, 0, + if (! ($$ = curr_parser->make_for_command (FOR, $1, $3, $5, 0, $7, $8, $2))) ABORT_PARSE; } | FOR stash_comment '(' assign_lhs '=' expression ')' opt_sep opt_list END { - if (! ($$ = make_for_command (FOR, $1, $4, $6, 0, + if (! ($$ = curr_parser->make_for_command (FOR, $1, $4, $6, 0, $9, $10, $2))) ABORT_PARSE; } | PARFOR stash_comment assign_lhs '=' expression opt_sep opt_list END { - if (! ($$ = make_for_command (PARFOR, $1, $3, $5, + if (! ($$ = curr_parser->make_for_command (PARFOR, $1, $3, $5, 0, $7, $8, $2))) ABORT_PARSE; } | PARFOR stash_comment '(' assign_lhs '=' expression ',' expression ')' opt_sep opt_list END { - if (! ($$ = make_for_command (PARFOR, $1, $4, $6, + if (! ($$ = curr_parser->make_for_command (PARFOR, $1, $4, $6, $8, $11, $12, $2))) ABORT_PARSE; } @@ -1176,17 +982,17 @@ jump_command : BREAK { - if (! ($$ = make_break_command ($1))) + if (! ($$ = curr_parser->make_break_command ($1))) ABORT_PARSE; } | CONTINUE { - if (! ($$ = make_continue_command ($1))) + if (! ($$ = curr_parser->make_continue_command ($1))) ABORT_PARSE; } | FUNC_RET { - if (! ($$ = make_return_command ($1))) + if (! ($$ = curr_parser->make_return_command ($1))) ABORT_PARSE; } ; @@ -1198,18 +1004,18 @@ except_command : UNWIND stash_comment opt_sep opt_list CLEANUP stash_comment opt_sep opt_list END { - if (! ($$ = make_unwind_command ($1, $4, $8, $9, $2, $6))) + if (! ($$ = curr_parser->make_unwind_command ($1, $4, $8, $9, $2, $6))) ABORT_PARSE; } | TRY stash_comment opt_sep opt_list CATCH stash_comment opt_sep opt_list END { - if (! ($$ = make_try_command ($1, $4, $8, $9, $2, $6))) + if (! ($$ = curr_parser->make_try_command ($1, $4, $8, $9, $2, $6))) ABORT_PARSE; } | TRY stash_comment opt_sep opt_list END { - if (! ($$ = make_try_command ($1, $4, 0, $5, $2, 0))) + if (! ($$ = curr_parser->make_try_command ($1, $4, 0, $5, $2, 0))) ABORT_PARSE; } ; @@ -1342,10 +1148,11 @@ script_file : SCRIPT_FILE opt_list END_OF_INPUT { tree_statement *end_of_script - = make_end ("endscript", curr_lexer->input_line_number, - curr_lexer->current_input_column); - - make_script ($2, end_of_script); + = curr_parser->make_end ("endscript", + curr_lexer->input_line_number, + curr_lexer->current_input_column); + + curr_parser->make_script ($2, end_of_script); $$ = 0; } @@ -1378,13 +1185,13 @@ function : function_beg function1 { - $$ = finish_function (0, $2, $1); - recover_from_parsing_function (); + $$ = curr_parser->finish_function (0, $2, $1); + curr_parser->recover_from_parsing_function (); } | function_beg return_list '=' function1 { - $$ = finish_function ($2, $4, $1); - recover_from_parsing_function (); + $$ = curr_parser->finish_function ($2, $4, $1); + curr_parser->recover_from_parsing_function (); } ; @@ -1417,22 +1224,22 @@ delete $1; - if (! ($$ = frob_function (fname, $2))) + if (! ($$ = curr_parser->frob_function (fname, $2))) ABORT_PARSE; } ; function2 : param_list opt_sep opt_list function_end - { $$ = start_function ($1, $3, $4); } + { $$ = curr_parser->start_function ($1, $3, $4); } | opt_sep opt_list function_end - { $$ = start_function (0, $2, $3); } + { $$ = curr_parser->start_function (0, $2, $3); } ; function_end : END { endfunction_found = true; - if (end_token_ok ($1, token::function_end)) - $$ = make_end ("endfunction", $1->line (), $1->column ()); + if (curr_parser->end_token_ok ($1, token::function_end)) + $$ = curr_parser->make_end ("endfunction", $1->line (), $1->column ()); else ABORT_PARSE; } @@ -1466,8 +1273,9 @@ YYABORT; } - $$ = make_end ("endfunction", curr_lexer->input_line_number, - curr_lexer->current_input_column); + $$ = curr_parser->make_end ("endfunction", + curr_lexer->input_line_number, + curr_lexer->current_input_column); } ; @@ -1486,8 +1294,8 @@ { curr_lexer->parsing_classdef = false; - if (end_token_ok ($1, token::classdef_end)) - $$ = make_end ("endclassdef", $1->line (), $1->column ()); + if (curr_parser->end_token_ok ($1, token::classdef_end)) + $$ = curr_parser->make_end ("endclassdef", $1->line (), $1->column ()); else ABORT_PARSE; } @@ -1734,8 +1542,9 @@ // Error mesages for mismatched end tokens. -static void -end_error (const char *type, token::end_tok_type ettype, int l, int c) +void +octave_parser::end_error (const char *type, token::end_tok_type ettype, + int l, int c) { static const char *fmt = "'%s' command matched by '%s' near line %d column %d"; @@ -1786,8 +1595,8 @@ // Check to see that end tokens are properly matched. -static bool -end_token_ok (token *tok, token::end_tok_type expected) +bool +octave_parser::end_token_ok (token *tok, token::end_tok_type expected) { bool retval = true; @@ -1856,8 +1665,8 @@ // Maybe print a warning if an assignment expression is used as the // test in a logical expression. -static void -maybe_warn_assign_as_truth_value (tree_expression *expr) +void +octave_parser::maybe_warn_assign_as_truth_value (tree_expression *expr) { if (expr->is_assignment_expression () && expr->paren_count () < 2) @@ -1876,8 +1685,8 @@ // Maybe print a warning about switch labels that aren't constants. -static void -maybe_warn_variable_switch_label (tree_expression *expr) +void +octave_parser::maybe_warn_variable_switch_label (tree_expression *expr) { if (! expr->is_constant ()) { @@ -1983,8 +1792,8 @@ // Finish building a range. -static tree_expression * -finish_colon_expression (tree_colon_expression *e) +tree_expression * +octave_parser::finish_colon_expression (tree_colon_expression *e) { tree_expression *retval = e; @@ -2047,8 +1856,8 @@ // Make a constant. -static tree_constant * -make_constant (int op, token *tok_val) +tree_constant * +octave_parser::make_constant (int op, token *tok_val) { int l = tok_val->line (); int c = tok_val->column (); @@ -2110,8 +1919,8 @@ // Make a function handle. -static tree_fcn_handle * -make_fcn_handle (token *tok_val) +tree_fcn_handle * +octave_parser::make_fcn_handle (token *tok_val) { int l = tok_val->line (); int c = tok_val->column (); @@ -2123,8 +1932,9 @@ // Make an anonymous function handle. -static tree_anon_fcn_handle * -make_anon_fcn_handle (tree_parameter_list *param_list, tree_statement *stmt) +tree_anon_fcn_handle * +octave_parser::make_anon_fcn_handle (tree_parameter_list *param_list, + tree_statement *stmt) { // FIXME -- need to get these from the location of the @ symbol. int l = curr_lexer->input_line_number; @@ -2156,9 +1966,9 @@ // Build a binary expression. -static tree_expression * -make_binary_op (int op, tree_expression *op1, token *tok_val, - tree_expression *op2) +tree_expression * +octave_parser::make_binary_op (int op, tree_expression *op1, token *tok_val, + tree_expression *op2) { octave_value::binary_op t = octave_value::unknown_binary_op; @@ -2260,9 +2070,9 @@ // Build a boolean expression. -static tree_expression * -make_boolean_op (int op, tree_expression *op1, token *tok_val, - tree_expression *op2) +tree_expression * +octave_parser::make_boolean_op (int op, tree_expression *op1, token *tok_val, + tree_expression *op2) { tree_boolean_expression::type t; @@ -2292,8 +2102,8 @@ // Build a prefix expression. -static tree_expression * -make_prefix_op (int op, tree_expression *op1, token *tok_val) +tree_expression * +octave_parser::make_prefix_op (int op, tree_expression *op1, token *tok_val) { octave_value::unary_op t = octave_value::unknown_unary_op; @@ -2335,8 +2145,8 @@ // Build a postfix expression. -static tree_expression * -make_postfix_op (int op, tree_expression *op1, token *tok_val) +tree_expression * +octave_parser::make_postfix_op (int op, tree_expression *op1, token *tok_val) { octave_value::unary_op t = octave_value::unknown_unary_op; @@ -2374,10 +2184,13 @@ // Build an unwind-protect command. -static tree_command * -make_unwind_command (token *unwind_tok, tree_statement_list *body, - tree_statement_list *cleanup, token *end_tok, - octave_comment_list *lc, octave_comment_list *mc) +tree_command * +octave_parser::make_unwind_command (token *unwind_tok, + tree_statement_list *body, + tree_statement_list *cleanup, + token *end_tok, + octave_comment_list *lc, + octave_comment_list *mc) { tree_command *retval = 0; @@ -2397,10 +2210,11 @@ // Build a try-catch command. -static tree_command * -make_try_command (token *try_tok, tree_statement_list *body, - tree_statement_list *cleanup, token *end_tok, - octave_comment_list *lc, octave_comment_list *mc) +tree_command * +octave_parser::make_try_command (token *try_tok, tree_statement_list *body, + tree_statement_list *cleanup, token *end_tok, + octave_comment_list *lc, + octave_comment_list *mc) { tree_command *retval = 0; @@ -2420,10 +2234,10 @@ // Build a while command. -static tree_command * -make_while_command (token *while_tok, tree_expression *expr, - tree_statement_list *body, token *end_tok, - octave_comment_list *lc) +tree_command * +octave_parser::make_while_command (token *while_tok, tree_expression *expr, + tree_statement_list *body, token *end_tok, + octave_comment_list *lc) { tree_command *retval = 0; @@ -2446,9 +2260,11 @@ // Build a do-until command. -static tree_command * -make_do_until_command (token *until_tok, tree_statement_list *body, - tree_expression *expr, octave_comment_list *lc) +tree_command * +octave_parser::make_do_until_command (token *until_tok, + tree_statement_list *body, + tree_expression *expr, + octave_comment_list *lc) { tree_command *retval = 0; @@ -2468,11 +2284,13 @@ // Build a for command. -static tree_command * -make_for_command (int tok_id, token *for_tok, tree_argument_list *lhs, - tree_expression *expr, tree_expression *maxproc, - tree_statement_list *body, token *end_tok, - octave_comment_list *lc) +tree_command * +octave_parser::make_for_command (int tok_id, token *for_tok, + tree_argument_list *lhs, + tree_expression *expr, + tree_expression *maxproc, + tree_statement_list *body, token *end_tok, + octave_comment_list *lc) { tree_command *retval = 0; @@ -2511,8 +2329,8 @@ // Build a break command. -static tree_command * -make_break_command (token *break_tok) +tree_command * +octave_parser::make_break_command (token *break_tok) { tree_command *retval = 0; @@ -2526,8 +2344,8 @@ // Build a continue command. -static tree_command * -make_continue_command (token *continue_tok) +tree_command * +octave_parser::make_continue_command (token *continue_tok) { tree_command *retval = 0; @@ -2541,8 +2359,8 @@ // Build a return command. -static tree_command * -make_return_command (token *return_tok) +tree_command * +octave_parser::make_return_command (token *return_tok) { tree_command *retval = 0; @@ -2556,8 +2374,9 @@ // Start an if command. -static tree_if_command_list * -start_if_command (tree_expression *expr, tree_statement_list *list) +tree_if_command_list * +octave_parser::start_if_command (tree_expression *expr, + tree_statement_list *list) { maybe_warn_assign_as_truth_value (expr); @@ -2568,9 +2387,9 @@ // Finish an if command. -static tree_if_command * -finish_if_command (token *if_tok, tree_if_command_list *list, - token *end_tok, octave_comment_list *lc) +tree_if_command * +octave_parser::finish_if_command (token *if_tok, tree_if_command_list *list, + token *end_tok, octave_comment_list *lc) { tree_if_command *retval = 0; @@ -2600,9 +2419,10 @@ // Build an elseif clause. -static tree_if_clause * -make_elseif_clause (token *elseif_tok, tree_expression *expr, - tree_statement_list *list, octave_comment_list *lc) +tree_if_clause * +octave_parser::make_elseif_clause (token *elseif_tok, tree_expression *expr, + tree_statement_list *list, + octave_comment_list *lc) { maybe_warn_assign_as_truth_value (expr); @@ -2614,10 +2434,10 @@ // Finish a switch command. -static tree_switch_command * -finish_switch_command (token *switch_tok, tree_expression *expr, - tree_switch_case_list *list, token *end_tok, - octave_comment_list *lc) +tree_switch_command * +octave_parser::finish_switch_command (token *switch_tok, tree_expression *expr, + tree_switch_case_list *list, + token *end_tok, octave_comment_list *lc) { tree_switch_command *retval = 0; @@ -2647,9 +2467,10 @@ // Build a switch case. -static tree_switch_case * -make_switch_case (token *case_tok, tree_expression *expr, - tree_statement_list *list, octave_comment_list *lc) +tree_switch_case * +octave_parser::make_switch_case (token *case_tok, tree_expression *expr, + tree_statement_list *list, + octave_comment_list *lc) { maybe_warn_variable_switch_label (expr); @@ -2661,9 +2482,9 @@ // Build an assignment to a variable. -static tree_expression * -make_assign_op (int op, tree_argument_list *lhs, token *eq_tok, - tree_expression *rhs) +tree_expression * +octave_parser::make_assign_op (int op, tree_argument_list *lhs, token *eq_tok, + tree_expression *rhs) { tree_expression *retval = 0; @@ -2757,8 +2578,9 @@ // Define a script. -static void -make_script (tree_statement_list *cmds, tree_statement *end_script) +void +octave_parser::make_script (tree_statement_list *cmds, + tree_statement *end_script) { std::string doc_string; @@ -2791,9 +2613,10 @@ // Begin defining a function. -static octave_user_function * -start_function (tree_parameter_list *param_list, tree_statement_list *body, - tree_statement *end_fcn_stmt) +octave_user_function * +octave_parser::start_function (tree_parameter_list *param_list, + tree_statement_list *body, + tree_statement *end_fcn_stmt) { // We'll fill in the return list later. @@ -2816,16 +2639,17 @@ return fcn; } -static tree_statement * -make_end (const std::string& type, int l, int c) +tree_statement * +octave_parser::make_end (const std::string& type, int l, int c) { return make_statement (new tree_no_op_command (type, l, c)); } // Do most of the work for defining a function. -static octave_user_function * -frob_function (const std::string& fname, octave_user_function *fcn) +octave_user_function * +octave_parser::frob_function (const std::string& fname, + octave_user_function *fcn) { std::string id_name = fname; @@ -2924,9 +2748,10 @@ return fcn; } -static tree_function_def * -finish_function (tree_parameter_list *ret_list, - octave_user_function *fcn, octave_comment_list *lc) +tree_function_def * +octave_parser::finish_function (tree_parameter_list *ret_list, + octave_user_function *fcn, + octave_comment_list *lc) { tree_function_def *retval = 0; @@ -2994,8 +2819,8 @@ return retval; } -static void -recover_from_parsing_function (void) +void +octave_parser::recover_from_parsing_function (void) { if (parser_symtab_context.empty ()) panic_impossible (); @@ -3017,9 +2842,9 @@ // Make an index expression. -static tree_index_expression * -make_index_expression (tree_expression *expr, tree_argument_list *args, - char type) +tree_index_expression * +octave_parser::make_index_expression (tree_expression *expr, + tree_argument_list *args, char type) { tree_index_expression *retval = 0; @@ -3050,8 +2875,9 @@ // Make an indirect reference expression. -static tree_index_expression * -make_indirect_ref (tree_expression *expr, const std::string& elt) +tree_index_expression * +octave_parser::make_indirect_ref (tree_expression *expr, + const std::string& elt) { tree_index_expression *retval = 0; @@ -3076,8 +2902,8 @@ // Make an indirect reference expression with dynamic field name. -static tree_index_expression * -make_indirect_ref (tree_expression *expr, tree_expression *elt) +tree_index_expression * +octave_parser::make_indirect_ref (tree_expression *expr, tree_expression *elt) { tree_index_expression *retval = 0; @@ -3102,8 +2928,9 @@ // Make a declaration command. -static tree_decl_command * -make_decl_command (int tok, token *tok_val, tree_decl_init_list *lst) +tree_decl_command * +octave_parser::make_decl_command (int tok, token *tok_val, + tree_decl_init_list *lst) { tree_decl_command *retval = 0; @@ -3137,8 +2964,8 @@ return retval; } -static tree_argument_list * -validate_matrix_row (tree_argument_list *row) +tree_argument_list * +octave_parser::validate_matrix_row (tree_argument_list *row) { if (row && row->has_magic_tilde ()) yyerror ("invalid use of tilde (~) in matrix expression"); @@ -3147,8 +2974,8 @@ // Finish building a matrix list. -static tree_expression * -finish_matrix (tree_matrix *m) +tree_expression * +octave_parser::finish_matrix (tree_matrix *m) { tree_expression *retval = m; @@ -3191,14 +3018,14 @@ // Finish building a cell list. -static tree_expression * -finish_cell (tree_cell *c) +tree_expression * +octave_parser::finish_cell (tree_cell *c) { return finish_matrix (c); } -static void -maybe_warn_missing_semi (tree_statement_list *t) +void +octave_parser::maybe_warn_missing_semi (tree_statement_list *t) { if (current_function_depth > 0) { @@ -3212,9 +3039,9 @@ } } -static tree_statement_list * -set_stmt_print_flag (tree_statement_list *list, char sep, - bool warn_missing_semi) +tree_statement_list * +octave_parser::set_stmt_print_flag (tree_statement_list *list, char sep, + bool warn_missing_semi) { tree_statement *tmp = list->back (); @@ -3249,15 +3076,16 @@ return list; } -static tree_statement_list * -make_statement_list (tree_statement *stmt) +tree_statement_list * +octave_parser::make_statement_list (tree_statement *stmt) { return new tree_statement_list (stmt); } -static tree_statement_list * -append_statement_list (tree_statement_list *list, char sep, - tree_statement *stmt, bool warn_missing_semi) +tree_statement_list * +octave_parser::append_statement_list (tree_statement_list *list, char sep, + tree_statement *stmt, + bool warn_missing_semi) { set_stmt_print_flag (list, sep, warn_missing_semi); @@ -3612,10 +3440,10 @@ else { tree_statement *end_of_script - = make_end ("endscript", curr_lexer->input_line_number, - curr_lexer->current_input_column); - - make_script (0, end_of_script); + = curr_parser->make_end ("endscript", curr_lexer->input_line_number, + curr_lexer->current_input_column); + + curr_parser->make_script (0, end_of_script); fcn_ptr = primary_fcn_ptr; }
--- a/libinterp/parse-tree/parse.h +++ b/libinterp/parse-tree/parse.h @@ -29,13 +29,39 @@ #include <stack> +#include "token.h" + extern int octave_lex (void); +class octave_comment_list; +class octave_function; +class octave_user_function; class tree; -class tree_matrix; +class tree_anon_fcn_handle; +class tree_argument_list; +class tree_cell; +class tree_colon_expression; +class tree_command; +class tree_constant; +class tree_decl_command; +class tree_decl_init_list; +class tree_expression; +class tree_fcn_handle; +class tree_function_def; class tree_identifier; +class tree_if_clause; +class tree_if_command; +class tree_if_command_list; +class tree_index_expression; +class tree_matrix; +class tree_matrix; +class tree_parameter_list; +class tree_statement; class tree_statement_list; -class octave_function; +class tree_statement_listtree_statement; +class tree_switch_case; +class tree_switch_case_list; +class tree_switch_command; #include "oct-obj.h" @@ -116,6 +142,200 @@ ~octave_parser (void) { } + // Error mesages for mismatched end tokens. + static void + end_error (const char *type, token::end_tok_type ettype, int l, int c); + + // Check to see that end tokens are properly matched. + static bool + end_token_ok (token *tok, token::end_tok_type expected); + + // Maybe print a warning if an assignment expression is used as the + // test in a logical expression. + static void + maybe_warn_assign_as_truth_value (tree_expression *expr); + + // Maybe print a warning about switch labels that aren't constants. + static void + maybe_warn_variable_switch_label (tree_expression *expr); + + // Finish building a range. + static tree_expression * + finish_colon_expression (tree_colon_expression *e); + + // Build a constant. + static tree_constant * + make_constant (int op, token *tok_val); + + // Build a function handle. + static tree_fcn_handle * + make_fcn_handle (token *tok_val); + + // Build an anonymous function handle. + static tree_anon_fcn_handle * + make_anon_fcn_handle (tree_parameter_list *param_list, tree_statement *stmt); + + // Build a binary expression. + static tree_expression * + make_binary_op (int op, tree_expression *op1, token *tok_val, + tree_expression *op2); + + // Build a boolean expression. + static tree_expression * + make_boolean_op (int op, tree_expression *op1, token *tok_val, + tree_expression *op2); + + // Build a prefix expression. + static tree_expression * + make_prefix_op (int op, tree_expression *op1, token *tok_val); + + // Build a postfix expression. + static tree_expression * + make_postfix_op (int op, tree_expression *op1, token *tok_val); + + // Build an unwind-protect command. + static tree_command * + make_unwind_command (token *unwind_tok, tree_statement_list *body, + tree_statement_list *cleanup, token *end_tok, + octave_comment_list *lc, octave_comment_list *mc); + + // Build a try-catch command. + static tree_command * + make_try_command (token *try_tok, tree_statement_list *body, + tree_statement_list *cleanup, token *end_tok, + octave_comment_list *lc, octave_comment_list *mc); + + // Build a while command. + static tree_command * + make_while_command (token *while_tok, tree_expression *expr, + tree_statement_list *body, token *end_tok, + octave_comment_list *lc); + + // Build a do-until command. + static tree_command * + make_do_until_command (token *until_tok, tree_statement_list *body, + tree_expression *expr, octave_comment_list *lc); + + // Build a for command. + static tree_command * + make_for_command (int tok_id, token *for_tok, tree_argument_list *lhs, + tree_expression *expr, tree_expression *maxproc, + tree_statement_list *body, token *end_tok, + octave_comment_list *lc); + + // Build a break command. + static tree_command * + make_break_command (token *break_tok); + + // Build a continue command. + static tree_command * + make_continue_command (token *continue_tok); + + // Build a return command. + static tree_command * + make_return_command (token *return_tok); + + // Start an if command. + static tree_if_command_list * + start_if_command (tree_expression *expr, tree_statement_list *list); + + // Finish an if command. + static tree_if_command * + finish_if_command (token *if_tok, tree_if_command_list *list, + token *end_tok, octave_comment_list *lc); + + // Build an elseif clause. + static tree_if_clause * + make_elseif_clause (token *elseif_tok, tree_expression *expr, + tree_statement_list *list, octave_comment_list *lc); + + // Finish a switch command. + static tree_switch_command * + finish_switch_command (token *switch_tok, tree_expression *expr, + tree_switch_case_list *list, token *end_tok, + octave_comment_list *lc); + + // Build a switch case. + static tree_switch_case * + make_switch_case (token *case_tok, tree_expression *expr, + tree_statement_list *list, octave_comment_list *lc); + + // Build an assignment to a variable. + static tree_expression * + make_assign_op (int op, tree_argument_list *lhs, token *eq_tok, + tree_expression *rhs); + + // Define a script. + static void + make_script (tree_statement_list *cmds, tree_statement *end_script); + + // Begin defining a function. + static octave_user_function * + start_function (tree_parameter_list *param_list, tree_statement_list *body, + tree_statement *end_function); + + // Create a no-op statement for end_function. + static tree_statement * + make_end (const std::string& type, int l, int c); + + // Do most of the work for defining a function. + static octave_user_function * + frob_function (const std::string& fname, octave_user_function *fcn); + + // Finish defining a function. + static tree_function_def * + finish_function (tree_parameter_list *ret_list, + octave_user_function *fcn, octave_comment_list *lc); + + // Reset state after parsing function. + static void + recover_from_parsing_function (void); + + // Make an index expression. + static tree_index_expression * + make_index_expression (tree_expression *expr, + tree_argument_list *args, char type); + + // Make an indirect reference expression. + static tree_index_expression * + make_indirect_ref (tree_expression *expr, const std::string&); + + // Make an indirect reference expression with dynamic field name. + static tree_index_expression * + make_indirect_ref (tree_expression *expr, tree_expression *field); + + // Make a declaration command. + static tree_decl_command * + make_decl_command (int tok, token *tok_val, tree_decl_init_list *lst); + + // Validate argument list forming a matrix or cell row. + static tree_argument_list * + validate_matrix_row (tree_argument_list *row); + + // Finish building a matrix list. + static tree_expression * + finish_matrix (tree_matrix *m); + + // Finish building a cell list. + static tree_expression * + finish_cell (tree_cell *c); + + // Maybe print a warning. Duh. + static void + maybe_warn_missing_semi (tree_statement_list *); + + // Set the print flag for a statement based on the separator type. + static tree_statement_list * + set_stmt_print_flag (tree_statement_list *, char, bool); + + // Create a statement list. + static tree_statement_list *make_statement_list (tree_statement *stmt); + + // Append a statement to an existing statement list. + static tree_statement_list * + append_statement_list (tree_statement_list *list, char sep, + tree_statement *stmt, bool warn_missing_semi); + // For unwind protect. static void cleanup (octave_parser *parser) { delete parser; }