diff libinterp/parse-tree/oct-parse.in.yy @ 18520:932aca9a7c57

Allow multi-level classdef package. * lex.h (octave_base_lexer::fq_identifier_contains_keyword, octave_base_lexer::handle_fq_identifier, octave_base_lexer::enable_fq_identifier): New methods. * lex.ll (octave_base_lexer::fq_identifier_contains_keyword, octave_base_lexer::handle_fq_identifier, octave_base_lexer::enable_fq_identifier): Likewise. (FQ_IDENT_START, FQIDENT): New exclusive start condition and regex to handle fully-qualified identifier. (superclass reference rule, metaclass query rule): Use FQIDENT. (octave_base_lexer::handle_superclass_identifier, octave_base_lexer::handle_meta_identifier): Don't split package name. * parse.h (octave_base_parser::make_superclass_ref, octave_base_parser::make_meta_class_query): Remove package_nm argument. * pt-classdef.h (tree_classdef_superclass::id, tree_classdef_superclass::pkg): Removed members, replaced by cls_name. (tree_classdef_superclass::~tree_classdef_superclass): Remove deletion of removed members. (tree_classdef_superclass::cls_name): New member. (tree_classdef_superclass::tree_classdef_superclass): Initialize it. (tree_classdef_superclass::ident, tree_classdef_superclass::package): Removed methods. (tree_classdef_superclass::class_name): New method. * token.h (token::meta_name_token): Remove enum value. (token(int, std::string, std::string, std::string, int, int)): Remove constructor. (token::superclass_package_name, token::meta_package_name, token::meta_class_name): Remove methods. (token::sc::package_nm, token::mc): Remove union members. * token.cc (token(int, std::string, std::string, std::string, int, int)): Remove constructor. (token::~token): Remove case of meta_name_token. (token::superclass_package_name, token::meta_package_name, token::meta_class_name): Remove methods. * oct-parse.in.yy (FQ_IDENT): New terminal. (superclass_identifier): Adapt to changes in class token and class octave_base_parser. (meta_identifier): Likewise. (superclass_list): Add mid-rule to enable fully-qualified identifier. (superclass): Use FQ_IDENT. (octave_base_parser::make_superclass_ref, octave_base_parser::make_meta_class_query): Remove package_nm argument. * ov-classdef.cc (octave_classdef_superclass_ref::do_multi_index_op): Adapt to removal of package_nm argument. (F__meta_class_query__): Likewise. (cdef_class::make_meta_class): Adapt to changes in class tree_classdef_superclass.
author Michael Goffioul <michael.goffioul@gmail.com>
date Sat, 22 Feb 2014 19:56:17 -0500
parents 9154dc252f47
children f958e8cd6348
line wrap: on
line diff
--- a/libinterp/parse-tree/oct-parse.in.yy	Sat Feb 22 08:23:26 2014 -0800
+++ b/libinterp/parse-tree/oct-parse.in.yy	Sat Feb 22 19:56:17 2014 -0500
@@ -235,6 +235,7 @@
 %token <tok_val> PROPERTIES METHODS EVENTS ENUMERATION
 %token <tok_val> METAQUERY
 %token <tok_val> SUPERCLASSREF
+%token <tok_val> FQ_IDENT
 %token <tok_val> GET SET
 %token <tok_val> FCN
 
@@ -485,23 +486,20 @@
                 : SUPERCLASSREF
                   {
                     std::string method_nm = $1->superclass_method_name ();
-                    std::string package_nm = $1->superclass_package_name ();
                     std::string class_nm = $1->superclass_class_name ();
 
                     $$ = parser.make_superclass_ref
-                                       (method_nm, package_nm, class_nm,
+                                       (method_nm, class_nm,
                                         $1->line (), $1->column ());
                   }
                 ;
 
 meta_identifier : METAQUERY
                   {
-                    std::string package_nm = $1->meta_package_name ();
-                    std::string class_nm = $1->meta_class_name ();
-
-                    $$ = parser.make_meta_class_query
-                                       (package_nm, class_nm,
-                                        $1->line (), $1->column ());
+                    std::string class_nm = $1->text ();
+
+                    $$ = parser.make_meta_class_query (class_nm, $1->line (),
+                                                       $1->column ());
                   }
                 ;
 
@@ -1553,19 +1551,21 @@
                   { $$ = $1; }
                 ;
 
-superclass_list : EXPR_LT superclass
-                  { $$ = new tree_classdef_superclass_list ($2); }
-                | superclass_list EXPR_AND superclass
+superclass_list : EXPR_LT
+                  { lexer.enable_fq_identifier (); }
+                  superclass
+                  { $$ = new tree_classdef_superclass_list ($3); }
+                | superclass_list EXPR_AND
+                  { lexer.enable_fq_identifier (); }
+                  superclass
                   {
-                    $1->append ($3);
+                    $1->append ($4);
                     $$ = $1;
                   }
                 ;
 
-superclass      : identifier
-                  { $$ = new tree_classdef_superclass ($1); }
-                | identifier '.' identifier
-                  { $$ = new tree_classdef_superclass ($3, $1); }
+superclass      : FQ_IDENT
+                  { $$ = new tree_classdef_superclass ($1->text ()); }
                 ;
 
 class_body      : properties_block
@@ -3115,14 +3115,12 @@
 
 tree_funcall *
 octave_base_parser::make_superclass_ref (const std::string& method_nm,
-                                         const std::string& package_nm,
                                          const std::string& class_nm,
                                          int l, int c)
 {
   octave_value_list args;
 
-  args(2) = class_nm;
-  args(1) = package_nm;
+  args(1) = class_nm;
   args(0) = method_nm;
 
   octave_value fcn
@@ -3132,14 +3130,12 @@
 }
 
 tree_funcall *
-octave_base_parser::make_meta_class_query (const std::string& package_nm,
-                                           const std::string& class_nm,
+octave_base_parser::make_meta_class_query (const std::string& class_nm,
                                            int l, int c)
 {
   octave_value_list args;
 
-  args(1) = class_nm;
-  args(0) = package_nm;
+  args(0) = class_nm;
 
   octave_value fcn
     = symbol_table::find_built_in_function ("__meta_class_query__");