diff libinterp/parse-tree/pt-pr-code.cc @ 29724:c19f8cbe0fd5

initial implementation of parsing for arguments validaton block (bug #59405) This change allows parsing of arguments validation blocks. Octave should now accept the arguments block syntax in a mostly Matlab compatible way. Multiple argument blocks are allowed. All arguments blocks must appear before any other exectuable statements in a function. Similar to "methods", "properties", etc., "arguments" is defined as a keyword in the octave.gperf file so that converting "arguments" to the ARGUMENTS token in the lexer and parser is simplified but it is not really treated as a reserved keyword in the language. One known problem with the current approach is that function [...] = f (...) arguments = 13; ... end will result in a parse error. A simple workaround is to place another statement (that is not an arguments block) ahead of the "arguments = ..." line in the function. Fixing this problem generally might require a different parsing method that allows a different type of lookahead than we currently use. NOTE: arguments blocks do not currently perform any actions. Since they may provide default values and/or transform arguments to different types or values, ignoring the arguments block can lead to incorrect results. Octave also currently allows arguments blocks in nested functions though they should be rejected. Special treatment of "arguments" and "endarguments" may be disabled by defining the macro DISABLE_ARGUMENTS_VALIDATION_BLOCK. With this macro defined, Octave's lexer will never return the ARGUMENTS token, so the parser will fail to parse these program elements and the behavior should be the same as prior to this change. * pt-args-block.h, pt-args-block.cc: New files. * libinterp/parse-tree/module.mk: Update. * lex.h, lex.ll (lexical_feedback::m_arguments_is_keyword): New member variable. (lexical_feedback::reset): Reset m_arguments_is_keyword to false. (iskeyword, Fiskeyword): Also handle "arguments" as a special case. (base_lexer::make_keyword_token): Handle arguments and endarguments. * parse.h, oct-parse.yy (base_parser::make_arguments_block, base_parser::make_args_attribute_list, base_parser::make_arg_validation, base_parser::make_args_validation_list, base_parser::append_args_validation_list, base_parser::make_arg_size_spec, base_parser::make_arg_validation_fcns): New functions. (function_body, at_first_executable_stmt, function_body1, arguments_block, arguments_beg, args_attr_list, args_validation_list, arg_validation, size_spec, class_name, validation_fcns, default_value): New non-terminals. (ARGUMENTS): New token. (function): Use new function_body and function_body1 non-terminals to accept arguments blocks, but only at the beginning of a function. (fcn_name): Set lexer.m_arguments_is_keyword to true after parsing function name. (param_list_beg): Set lexer.m_arguments_is_keyword to false while parsing function parameter list. (param_list_beg): Reset lexer.m_arguments_is_keyword to true after parsing function parameter list. (tree_arguments_block_type, tree_args_block_attribute_list_type, tree_args_block_validation_list_type, tree_arg_size_spec_type, tree_arg_validation_type, tree_arg_validation_fcns_type): New non-terminal types. Also declare %destructors for them. * octave.gperf (octave_kw_id): New IDs, arguments_kw and endarguments_kw. Provide entries for arguments and endarguments keywords. * pt-all.h: Include pt-args-block.h. * pt-bp.h, pt-bp.cc (tree_breakpoint::visit_arguments_block, tree_breakpoint::visit_args_block_attribute_list, tree_breakpoint::visit_args_block_validation_list, tree_breakpoint::visit_arg_validation, tree_breakpoint::visit_arg_size_spec, tree_breakpoint::visit_arg_validation_fcns): New virtual functions for arguments block elements. * pt-eval.h, pt-eval.cc (tree_evaluator::visit_arguments_block, tree_evaluator::visit_args_block_attribute_list, tree_evaluator::visit_args_block_validation_list, tree_evaluator::visit_arg_validation, tree_evaluator::visit_arg_size_spec, tree_evaluator::visit_arg_validation_fcns): New virtual functions for arguments block elements. * pt-pr-code.h, pt-pr-code.cc (tree_print_code::visit_arguments_block, tree_print_code::visit_args_block_attribute_list, tree_print_code::visit_args_block_validation_list, tree_print_code::visit_arg_validation, tree_print_code::visit_arg_size_spec, tree_print_code::visit_arg_validation_fcns): New virtual functions for arguments block elements. * pt-walk.h, pt-walk.cc (tree_walker::visit_arguments_block, tree_walker::visit_args_block_attribute_list, tree_walker::visit_args_block_validation_list, tree_walker::visit_arg_validation, tree_walker::visit_arg_size_spec, tree_walker::visit_arg_validation_fcns): New virtual functions for arguments block elements. * token.h (end_tok_type): New type, arguments_end.
author John W. Eaton <jwe@octave.org>
date Tue, 01 Jun 2021 13:34:57 -0400
parents 32f4357ac8d9
children 796f54d4ddbf
line wrap: on
line diff
--- a/libinterp/parse-tree/pt-pr-code.cc	Tue Jun 01 16:57:40 2021 -0400
+++ b/libinterp/parse-tree/pt-pr-code.cc	Tue Jun 01 13:34:57 2021 -0400
@@ -76,6 +76,45 @@
   }
 
   void
+  tree_print_code::visit_arguments_block (tree_arguments_block&)
+  {
+    indent ();
+
+    // FIXME
+    m_os << "arguments ... endarguments";
+  }
+
+  void
+  tree_print_code::visit_args_block_attribute_list (tree_args_block_attribute_list&)
+  {
+    panic_impossible ();
+  }
+
+  void
+  tree_print_code::visit_args_block_validation_list (tree_args_block_validation_list&)
+  {
+    panic_impossible ();
+  }
+
+  void
+  tree_print_code::visit_arg_validation (tree_arg_validation&)
+  {
+    panic_impossible ();
+  }
+
+  void
+  tree_print_code::visit_arg_size_spec (tree_arg_size_spec&)
+  {
+    panic_impossible ();
+  }
+
+  void
+  tree_print_code::visit_arg_validation_fcns (tree_arg_validation_fcns&)
+  {
+    panic_impossible ();
+  }
+
+  void
   tree_print_code::visit_binary_expression (tree_binary_expression& expr)
   {
     indent ();