Browse Source

allow defaults everywhere

David Rose 21 years ago
parent
commit
842dd7bf26
3 changed files with 399 additions and 314 deletions
  1. 14 0
      direct/src/dcparser/dcClass.cxx
  2. 330 295
      direct/src/dcparser/dcParser.cxx.prebuilt
  3. 55 19
      direct/src/dcparser/dcParser.yxx

+ 14 - 0
direct/src/dcparser/dcClass.cxx

@@ -753,6 +753,20 @@ write(ostream &out, bool brief, int indent_level) const {
   Fields::const_iterator fi;
   for (fi = _fields.begin(); fi != _fields.end(); ++fi) {
     (*fi)->write(out, brief, indent_level + 2);
+
+    /*
+    if (true || (*fi)->has_default_value()) {
+      indent(out, indent_level + 2) << "// = ";
+      DCPacker packer;
+      packer.set_unpack_data((*fi)->get_default_value());
+      packer.begin_unpack(*fi);
+      packer.unpack_and_format(out);
+      if (!packer.end_unpack()) {
+        out << "<error>";
+      }
+      out << "\n";
+    }
+    */
   }
 
   indent(out, indent_level) << "};\n";

File diff suppressed because it is too large
+ 330 - 295
direct/src/dcparser/dcParser.cxx.prebuilt


+ 55 - 19
direct/src/dcparser/dcParser.yxx

@@ -132,7 +132,10 @@ dc_cleanup_parser() {
 %type <u.parameter> type_definition
 %type <u.parameter> named_parameter
 %type <u.parameter> unnamed_parameter
+%type <u.parameter> named_parameter_with_default
+%type <u.parameter> unnamed_parameter_with_default
 %type <u.parameter> parameter
+%type <u.parameter> parameter_with_default
 %type <u.parameter> parameter_definition
 %type <str> import_identifier
 %type <str> slash_identifier
@@ -223,7 +226,7 @@ import_symbol_list:
 	;
 
 typedef_decl:
-        KW_TYPEDEF parameter
+        KW_TYPEDEF parameter_with_default
 {
   DCTypedef *dtypedef = new DCTypedef($2);
 
@@ -311,12 +314,12 @@ dclass_field:
   $$->set_flags($2);
 }
 	| molecular_field
-	| unnamed_parameter server_flags ';'
+	| unnamed_parameter_with_default server_flags ';'
 {
   $$ = $1;
   $$->set_flags($2);
 }
-	| named_parameter server_flags
+	| named_parameter_with_default server_flags
 {
   $$ = $1;
   $$->set_flags($2);
@@ -387,11 +390,11 @@ struct_fields:
 struct_field:
 	atomic_field
 	| molecular_field
-	| unnamed_parameter ';'
+	| unnamed_parameter_with_default ';'
 {
   $$ = $1;
 }
-	| named_parameter
+	| named_parameter_with_default
 {
   $$ = $1;
 }
@@ -421,11 +424,30 @@ nonempty_parameter_list:
         ;
 
 atomic_element:
-        parameter
+        parameter_with_default
 {
   current_atomic->add_element($1);
 }
-	| parameter '=' 
+	;
+
+named_parameter:
+        type_definition
+{
+  current_parameter = $1;
+}
+        parameter_definition
+{
+  $$ = $3;
+}
+	;
+
+unnamed_parameter:
+	type_definition
+	;
+
+named_parameter_with_default:
+        named_parameter
+	| named_parameter '=' 
 {
   current_packer = &default_packer;
   current_packer->clear_data();
@@ -445,23 +467,32 @@ atomic_element:
     // error (there's no way for us to validate the syntax).  So we'll
     // just ignore the default value in this case.
   }
-  current_atomic->add_element($1);
 }
 	;
 
-named_parameter:
-        type_definition
+unnamed_parameter_with_default:
+        unnamed_parameter
+	| unnamed_parameter '=' 
 {
-  current_parameter = $1;
+  current_packer = &default_packer;
+  current_packer->clear_data();
+  current_packer->begin_pack($1);
 }
-        parameter_definition
+	parameter_value
 {
-  $$ = $3;
-}
-	;
+  bool is_valid = $1->is_valid();
+  if (current_packer->end_pack()) {
+    $1->set_default_value(current_packer->get_string());
 
-unnamed_parameter:
-	type_definition
+  } else {
+    if (is_valid) {
+      yyerror("Invalid default value for type");
+    }
+    // If the current parameter isn't valid, we don't mind a pack
+    // error (there's no way for us to validate the syntax).  So we'll
+    // just ignore the default value in this case.
+  }
+}
 	;
 
 parameter:
@@ -469,6 +500,11 @@ parameter:
         | unnamed_parameter
         ;
 
+parameter_with_default:
+        named_parameter_with_default
+        | unnamed_parameter_with_default
+        ;
+
 type_name:
         type_token
 {
@@ -1052,11 +1088,11 @@ switch_case:
 	;
 
 switch_field:
-	unnamed_parameter ';'
+	unnamed_parameter_with_default ';'
 {
   $$ = $1;
 }
-	| named_parameter
+	| named_parameter_with_default
 {
   $$ = $1;
 }

Some files were not shown because too many files changed in this diff