comparison src/ov-classdef.cc @ 15037:56b8eb7c9c04 classdef

improvements in parsing classdef * liboctave/base-list.h (octave_base_list::octave_base_list (void), octave_base_list::octave_base_list (const std::list<elt_type>&), octave_base_list::operator = (const octave_base_list&), octave_base_list::~octave_base_list (void)): Now public. * pt-classdef.h, pt-classdef.cc: New files. * src/Makefile.am (PT_INCLUDES): Add pt-classdef.h to the list. (PT_SRC): Add pt-classdef.cc to the list. * pt-all.h: Include pt-classdef.h. * ov.cc: Include ov-classdef.h. * ov-classdef.cc: Include pt-classdef.h. (cdef_class:make_meta_class): New method. (F__meta_get_class__): Delete. (F__superclass_reference__, F__meta_class_query__): New functions. * pt-id.h: Include oct-lvalue.h. * pt-walk.h (tree_walker::visit_classdef (tree_classdef&), tree_walker::visit_classdef_attribute (tree_classdef_attribute&), tree_walker::visit_classdef_attribute_list (tree_classdef_attribute_list&), tree_walker::visit_classdef_superclass (tree_classdef_superclass&), tree_walker::visit_classdef_superclass_list (tree_classdef_superclass_list&), tree_walker::visit_classdef_property (tree_classdef_property&), tree_walker::visit_classdef_property_list (tree_classdef_property_list&), tree_walker::visit_classdef_properties_block (tree_classdef_properties_block&), tree_walker::visit_classdef_methods_list (tree_classdef_methods_list&), tree_walker::visit_classdef_methods_block (tree_classdef_methods_block&), tree_walker::visit_classdef_event (tree_classdef_event&), tree_walker::visit_classdef_events_list (tree_classdef_events_list&), tree_walker::visit_classdef_events_block (tree_classdef_events_block&), tree_walker::visit_classdef_enum (tree_classdef_enum&), tree_walker::visit_classdef_enum_list (tree_classdef_enum_list&), tree_walker::visit_classdef_enum_block (tree_classdef_enum_block&), tree_walker::visit_classdef_body (tree_classdef_body&)): New virtual functions. * token.h, token.cc (token::sc::mr, token::sc::cr, token::sc::pr, token::mc::mr, token::mc::pr): Delete. (token::sc::method_name, token::sc::package_name, token::sc::class_name, token::mc::package_name, token::mc::class_name): New member variables. (token::method_rec, token::class_rec, token::package_rec, token::meta_class_rec, token::meta_package_rec): Delete. (token::superclass_method_name, token::superclass_package_name, token::superclass_class_name, token::meta_package_name, token::meta_class_name): New methods. (token::token (symbol_table::symbol_record*, int, int), token::token (symbol_table::symbol_record*, symbol_table::symbol_record*, int, int), token::token (symbol_table::symbol_record*, symbol_table::symbol_record*, symbol_table::symbol_record*, int, int)): Delete. (token::token (const std::string&, const std::string&, int, int), token::token (const std::string&, const std::string&, const std::string&, int, int)): New constructors. (token::scls_rec_token, token::meta_rec_token): Delete enum values. (token::scls_name_token, token::meta_rec_token): New enum values. (token::~token): Delete sc and mc struct memebers. * lex.ll, lex.h (lexical_feedback::parsing_classdef_get_method, lexical_feedback::parsing_classdef_set_method)): New data members. (lexical_feedback::lexical_feedback, lexical_feedback::init): Initialize new data members. (prep_lexer_for_classdef_file): New function. (CLASSDEF_FILE_BEGIN): New exclusive start state. (handle_superclass_identifier, handle_meta_identifier): Split identifier here and create token with character strings. (display_token): Handle CLASSDEF_FILE. (display_state): Handle CLASSDEF_FILE_BEGIN. * oct-parse.yy: Include ov-classdef.h and pt-funcall.h. (classdef_object): New static variable. (make_superclass_ref, make_meta_class_query, make_classdef, make_classdef_properties_block, make_classdef_methods_block, make_classdef_events_block, make_classdef_enum_block)): New functions. (dummy_type): Delete unused nonterminal type. (tok_type, tree_funcall_type, tree_function_def_type, tree_classdef_type, tree_classdef_attribute_type, tree_classdef_attribute_list_type, tree_classdef_superclass_type, tree_classdef_superclass_list_type, tree_classdef_body_type, tree_classdef_property_type, tree_classdef_property_list_type, tree_classdef_properties_block_type, tree_classdef_methods_list_type, tree_classdef_methods_block_type, tree_classdef_event_type, tree_classdef_events_list_type, tree_classdef_events_block_type, tree_classdef_enum_type, tree_classdef_enum_list_type, tree_classdef_enum_block_type): New types for nonterminals. (CLASSDEF): Declare to have a tok_val token value. (CLASSDEF_FILE): New token. (classdef_end, properties_beg, methods_beg, events_beg, enum_beg, classdef1): Delete nonterminals. (property_list): Rename from properties_list. (attr, class_event, class_enum, class_property, property_list, properties_block, methods_list, methods_block, opt_attr_list, attr_list, events_list, events_blcok, enum_list, enum_block, class_body, classdef): Declare with specific types. Create parse tree objects for these nonterminals. (classdef_file): New nonterminal. (parse_fcn_file): Handle classdef files. Don't treat classdef files as scripts. (command): Don't handle classdef here. (input): Accept classdef_file here. (fcn_name): If GET, set lexer_flags.parsing_classdef_get_method. If SET, set lexer_flags.parsing_classdef_set_method.
author John W. Eaton <jwe@octave.org>
date Fri, 27 Jul 2012 17:10:25 -0400
parents aa1f9e479c6e
children
comparison
equal deleted inserted replaced
15036:aa1f9e479c6e 15037:56b8eb7c9c04
29 #include "defun.h" 29 #include "defun.h"
30 #include "ov-builtin.h" 30 #include "ov-builtin.h"
31 #include "ov-classdef.h" 31 #include "ov-classdef.h"
32 #include "ov-fcn-handle.h" 32 #include "ov-fcn-handle.h"
33 #include "ov-typeinfo.h" 33 #include "ov-typeinfo.h"
34 #include "pt-classdef.h"
34 35
35 static std::map<std::string, cdef_class> all_classes; 36 static std::map<std::string, cdef_class> all_classes;
36 static std::map<std::string, cdef_package> all_packages; 37 static std::map<std::string, cdef_package> all_packages;
37 38
38 static void 39 static void
952 cdef_class cls = lookup_class (super_classes(i).string_value ()); 953 cdef_class cls = lookup_class (super_classes(i).string_value ());
953 954
954 if (!error_state) 955 if (!error_state)
955 cls.delete_object (obj); 956 cls.delete_object (obj);
956 } 957 }
958 }
959
960 cdef_class
961 cdef_class::make_meta_class (const tree_classdef* t)
962 {
963 cdef_class retval;
964
965 return retval;
957 } 966 }
958 967
959 octave_value 968 octave_value
960 cdef_property::cdef_property_rep::get_value (const cdef_object& obj) 969 cdef_property::cdef_property_rep::get_value (const cdef_object& obj)
961 { 970 {
1368 package_meta.install_class (meta_package, "package"); 1377 package_meta.install_class (meta_package, "package");
1369 package_meta.install_class (meta_event, "event"); 1378 package_meta.install_class (meta_event, "event");
1370 package_meta.install_class (meta_dynproperty, "dynproperty"); 1379 package_meta.install_class (meta_dynproperty, "dynproperty");
1371 } 1380 }
1372 1381
1373 DEFUN (__meta_get_class__, args, , "")
1374 {
1375 octave_value retval;
1376
1377 if (args.length () == 1)
1378 {
1379 std::string cname = args(0).string_value ();
1380
1381 if (! error_state)
1382 retval = to_ov (lookup_class (cname));
1383 else
1384 error ("invalid class name, expected a string value");
1385 }
1386 else
1387 print_usage ();
1388
1389 return retval;
1390 }
1391
1392 DEFUN (__meta_get_package__, args, , "") 1382 DEFUN (__meta_get_package__, args, , "")
1393 { 1383 {
1394 octave_value retval; 1384 octave_value retval;
1395 1385
1396 if (args.length () == 1) 1386 if (args.length () == 1)
1399 1389
1400 if (! error_state) 1390 if (! error_state)
1401 retval = to_ov (lookup_package (cname)); 1391 retval = to_ov (lookup_package (cname));
1402 else 1392 else
1403 error ("invalid package name, expected a string value"); 1393 error ("invalid package name, expected a string value");
1394 }
1395 else
1396 print_usage ();
1397
1398 return retval;
1399 }
1400
1401 DEFUN (__superclass_reference__, args, /* nargout */,
1402 "-*- texinfo -*-\n\
1403 @deftypefn {Built-in Function} {} __superclass_reference__ ()\n\
1404 Undocumented internal function.\n\
1405 @end deftypefn")
1406 {
1407 octave_value retval;
1408
1409 std::cerr << "__superclass_reference__ ("
1410 << args(0).string_value () << ", "
1411 << args(1).string_value () << ", "
1412 << args(2).string_value () << ")"
1413 << std::endl;
1414
1415 return retval;
1416 }
1417
1418 DEFUN (__meta_class_query__, args, /* nargout */,
1419 "-*- texinfo -*-\n\
1420 @deftypefn {Built-in Function} {} __meta_class_query__ ()\n\
1421 Undocumented internal function.\n\
1422 @end deftypefn")
1423 {
1424 octave_value retval;
1425
1426 std::cerr << "__meta_class_query__ ("
1427 << args(0).string_value () << ", "
1428 << args(1).string_value () << ")"
1429 << std::endl;
1430
1431 if (args.length () == 2)
1432 {
1433 std::string pkg = args(0).string_value ();
1434 std::string cls = args(1).string_value ();
1435
1436 if (! pkg.empty ())
1437 cls = pkg + "." + cls;
1438
1439 if (! error_state)
1440 retval = to_ov (lookup_class (cls));
1441 else
1442 error ("invalid class name, expected a string value");
1404 } 1443 }
1405 else 1444 else
1406 print_usage (); 1445 print_usage ();
1407 1446
1408 return retval; 1447 return retval;