Mercurial > octave
changeset 29729:d0ce7260978d
also accept validation syntax for classdef properties
* parse.h, oct-parse.yy (arg_name): New non-terminal.
(arg_validation): Don't accept identifier here.
(args_validation_list): Use arg_name here.
(class_property): Use arg_validation instead of '=' expression alone.
(base_parser::make_arg_validation): Eliminate arg_name argument.
* pt-args-block.h (tree_arg_validation::tree_arg_validation):
Elimnate arg_name argument.
(tree_arg_validation::arg_name, tree_arg_validation::validation_fcns,
tree_arg_validation::identifier_expression,
tree_arg_validation::size_spec, tree_arg_validation::class_name,
tree_arg_validation::initializer_expression): New functions.
* pt-classdef.h, pt-classdef.cc (tree_classdef_property::m_av):
New data member to replace separate m_id and m_expr data members.
(tree_classdef_property::tree_classdef_property):
Accept tree_arg_validation argument instead of tree_identifier and
tree_expression separately.
(tree_classdef_property::~tree_classdef_property,
tree_classdef_property::ident, tree_classdef_property::expression):
Update.
* pt-eval.cc (tree_evaluator::visit_arguments_block): Emphasize that
incorrect results are possible for ignored argument validation blocks.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 04 Jun 2021 13:58:59 -0400 |
parents | 287fde79ffa2 |
children | 6d5ed3650447 |
files | libinterp/parse-tree/oct-parse.yy libinterp/parse-tree/parse.h libinterp/parse-tree/pt-args-block.h libinterp/parse-tree/pt-classdef.cc libinterp/parse-tree/pt-classdef.h libinterp/parse-tree/pt-eval.cc |
diffstat | 6 files changed, 84 insertions(+), 47 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/parse-tree/oct-parse.yy Fri Jun 04 08:25:35 2021 -0400 +++ b/libinterp/parse-tree/oct-parse.yy Fri Jun 04 13:58:59 2021 -0400 @@ -259,6 +259,7 @@ %type <tree_expression_type> matrix cell %type <tree_expression_type> primary_expr oper_expr power_expr %type <tree_expression_type> simple_expr colon_expr assign_expr expression +%type <tree_expression_type> arg_name %type <tree_identifier_type> identifier fcn_name magic_tilde %type <tree_superclass_ref_type> superclass_identifier %type <tree_metaclass_query_type> meta_identifier @@ -1858,22 +1859,31 @@ ; args_validation_list - : arg_validation - { $$ = parser.make_args_validation_list ($1); } - | args_validation_list sep arg_validation + : arg_name arg_validation + { + $2->arg_name ($1); + $$ = parser.make_args_validation_list ($2); + } + | args_validation_list sep arg_name arg_validation { OCTAVE_YYUSE ($2); - $$ = parser.append_args_validation_list ($1, $3); + $4->arg_name ($3); + $$ = parser.append_args_validation_list ($1, $4); } ; -arg_validation : identifier size_spec class_name validation_fcns default_value +// FIXME: Change grammar to allow IDENTIFIER to be be either +// "NAME" or "NAME '.' NAME", possibly not entered in the symbol +// table for the current scope. Also stash comments before identifier. + +arg_name : identifier + { $$ = $1; } + ; + +arg_validation : size_spec class_name validation_fcns default_value { - // FIXME: Change grammar to allow IDENTIFIER to be - // be either "NAME" or "NAME '.' NAME". - - if (! ($$ = parser.make_arg_validation ($1, $2, $3, $4, $5))) + if (! ($$ = parser.make_arg_validation ($1, $2, $3, $4))) { // make_arg_validation deleted ... YYABORT; @@ -2156,15 +2166,20 @@ } ; -class_property : stash_comment identifier +class_property : stash_comment identifier arg_validation { - $$ = new octave::tree_classdef_property ($2, $1); - } - | stash_comment identifier '=' expression - { - OCTAVE_YYUSE ($3); - - $$ = new octave::tree_classdef_property ($2, $4, $1); + // FIXME: Maybe this should be in a separate + // base_parser::make_classdef_property function? + + octave::tree_arg_validation *av = $3; + + av->arg_name ($2); + + if (av->size_spec () || av->class_name () + || av->validation_fcns ()) + warning ("size, class, and validation function specifications are not yet supported for classdef properties; INCORRECT RESULTS ARE POSSIBLE!"); + + $$ = new octave::tree_classdef_property (av, $1); } ; @@ -4096,8 +4111,7 @@ } tree_arg_validation * - base_parser::make_arg_validation (tree_expression *arg_name, - tree_arg_size_spec *size_spec, + base_parser::make_arg_validation (tree_arg_size_spec *size_spec, tree_identifier *class_name, tree_arg_validation_fcns *validation_fcns, tree_expression *default_value) @@ -4105,7 +4119,7 @@ // FIXME: Validate arguments and convert to more specific types // (std::string for arg_name and class_name, etc). - return new tree_arg_validation (arg_name, size_spec, class_name, + return new tree_arg_validation (size_spec, class_name, validation_fcns, default_value); }
--- a/libinterp/parse-tree/parse.h Fri Jun 04 08:25:35 2021 -0400 +++ b/libinterp/parse-tree/parse.h Fri Jun 04 13:58:59 2021 -0400 @@ -395,8 +395,7 @@ // Make an argument validation. OCTINTERP_API tree_arg_validation * - make_arg_validation (tree_expression *arg_name, - tree_arg_size_spec *size_spec, + make_arg_validation (tree_arg_size_spec *size_spec, tree_identifier *class_name, tree_arg_validation_fcns *validation_fcns, tree_expression *default_value);
--- a/libinterp/parse-tree/pt-args-block.h Fri Jun 04 08:25:35 2021 -0400 +++ b/libinterp/parse-tree/pt-args-block.h Fri Jun 04 13:58:59 2021 -0400 @@ -36,6 +36,9 @@ #include "base-list.h" +// FIXME: We could maybe re-think the naming of some of these objects +// before releasing a version that contains these new classes... + namespace octave { class tree_arg_size_spec @@ -100,12 +103,11 @@ { public: - tree_arg_validation (tree_expression *arg_name, - tree_arg_size_spec *size_spec, + tree_arg_validation (tree_arg_size_spec *size_spec, tree_identifier *class_name, tree_arg_validation_fcns *validation_fcns, tree_expression *default_value) - : m_arg_name (arg_name), m_size_spec (size_spec), + : m_arg_name (nullptr), m_size_spec (size_spec), m_class_name (class_name), m_validation_fcns (validation_fcns), m_default_value (default_value) { } @@ -125,6 +127,23 @@ delete m_default_value; } + void arg_name (tree_expression *name) + { + m_arg_name = name; + } + + tree_expression * identifier_expression (void) { return m_arg_name; } + + tree_arg_size_spec * size_spec (void) { return m_size_spec; } + + tree_identifier * class_name (void) { return m_class_name; } + + tree_arg_validation_fcns * + validation_fcns (void) { return m_validation_fcns; } + + tree_expression * + initializer_expression (void) { return m_default_value; } + void accept (tree_walker& tw) { tw.visit_arg_validation (*this);
--- a/libinterp/parse-tree/pt-classdef.cc Fri Jun 04 08:25:35 2021 -0400 +++ b/libinterp/parse-tree/pt-classdef.cc Fri Jun 04 13:58:59 2021 -0400 @@ -31,6 +31,7 @@ #include "ov.h" #include "ov-classdef.h" +#include "pt-args-block.h" #include "pt-classdef.h" #include "pt-eval.h" @@ -137,18 +138,28 @@ return ""; } - tree_classdef_property::tree_classdef_property (tree_identifier *i, + tree_classdef_property::tree_classdef_property (tree_arg_validation *av, comment_list *comments) - : m_id (i), m_expr (nullptr), m_comments (comments), + : m_av (av), m_comments (comments), m_doc_string (check_for_doc_string (m_comments)) { } - tree_classdef_property::tree_classdef_property (tree_identifier *i, - tree_expression *e, - comment_list *comments) - : m_id (i), m_expr (e), m_comments (comments), - m_doc_string (check_for_doc_string (m_comments)) - { } + tree_classdef_property::~tree_classdef_property (void) + { + delete m_av; + } + + tree_identifier * tree_classdef_property::ident (void) + { + tree_expression *id_expr = m_av->identifier_expression (); + + return dynamic_cast<tree_identifier *> (id_expr); + } + + tree_expression * tree_classdef_property::expression (void) + { + return m_av->initializer_expression (); + } // Classdef property_list
--- a/libinterp/parse-tree/pt-classdef.h Fri Jun 04 08:25:35 2021 -0400 +++ b/libinterp/parse-tree/pt-classdef.h Fri Jun 04 13:58:59 2021 -0400 @@ -44,6 +44,8 @@ { class interpreter; + class tree_arg_validation; + class tree_superclass_ref : public tree_expression { public: @@ -317,10 +319,7 @@ { public: - tree_classdef_property (tree_identifier *i, - comment_list *comments = nullptr); - - tree_classdef_property (tree_identifier *i, tree_expression *e, + tree_classdef_property (tree_arg_validation *av, comment_list *comments = nullptr); // No copying! @@ -329,15 +328,11 @@ tree_classdef_property& operator = (const tree_classdef_property&) = delete; - ~tree_classdef_property (void) - { - delete m_id; - delete m_expr; - } + ~tree_classdef_property (void); - tree_identifier * ident (void) { return m_id; } + tree_identifier * ident (void); - tree_expression * expression (void) { return m_expr; } + tree_expression * expression (void); comment_list * comments (void) const { return m_comments; } @@ -354,8 +349,7 @@ private: - tree_identifier *m_id; - tree_expression *m_expr; + tree_arg_validation *m_av; comment_list *m_comments; std::string m_doc_string; };
--- a/libinterp/parse-tree/pt-eval.cc Fri Jun 04 08:25:35 2021 -0400 +++ b/libinterp/parse-tree/pt-eval.cc Fri Jun 04 13:58:59 2021 -0400 @@ -1247,7 +1247,7 @@ void tree_evaluator::visit_arguments_block (tree_arguments_block&) { - warning ("function arguments validation blocks are not supported"); + warning ("function arguments validation blocks are not supported; INCORRECT RESULTS ARE POSSIBLE"); } void