瀏覽代碼

fix error messages when dc files loaded out of order

David Rose 21 年之前
父節點
當前提交
65f0fa0409
共有 2 個文件被更改,包括 82 次插入72 次删除
  1. 76 71
      direct/src/dcparser/dcParser.cxx.prebuilt
  2. 6 1
      direct/src/dcparser/dcParser.yxx

+ 76 - 71
direct/src/dcparser/dcParser.cxx.prebuilt

@@ -183,16 +183,16 @@ static const short yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
 static const short yyrline[] =
 {
-       0,    93,    95,    96,    97,   100,   100,   111,   125,   127,
-     133,   135,   141,   146,   146,   153,   155,   161,   166,   172,
-     174,   177,   184,   192,   194,   195,   196,   199,   199,   210,
-     226,   228,   231,   233,   236,   236,   248,   250,   254,   258,
-     264,   270,   276,   282,   292,   294,   297,   299,   302,   304,
-     307,   314,   320,   326,   332,   341,   350,   361,   366,   370,
-     374,   378,   382,   386,   390,   394,   398,   402,   406,   410,
-     414,   418,   422,   426,   430,   434,   440,   442,   446,   450,
-     454,   458,   462,   466,   470,   474,   480,   480,   491,   498,
-     511
+       0,    93,    95,    96,    97,   100,   100,   116,   130,   132,
+     138,   140,   146,   151,   151,   158,   160,   166,   171,   177,
+     179,   182,   189,   197,   199,   200,   201,   204,   204,   215,
+     231,   233,   236,   238,   241,   241,   253,   255,   259,   263,
+     269,   275,   281,   287,   297,   299,   302,   304,   307,   309,
+     312,   319,   325,   331,   337,   346,   355,   366,   371,   375,
+     379,   383,   387,   391,   395,   399,   403,   407,   411,   415,
+     419,   423,   427,   431,   435,   439,   445,   447,   451,   455,
+     459,   463,   467,   471,   475,   479,   485,   485,   496,   503,
+     516
 };
 #endif
 
@@ -1048,12 +1048,17 @@ case 5:
 {
   current_class = new DCClass(yyvsp[0].str);
   if (!dc_file->add_class(current_class)) {
-    yyerror("Duplicate class name: " + current_class->get_name());
+    DCClass *old_class = dc_file->get_class_by_name(current_class->get_name());
+    if (old_class->is_bogus_class()) {
+      yyerror("Base class defined after its first reference: " + current_class->get_name());
+    } else {
+      yyerror("Duplicate class name: " + current_class->get_name());
+    }
   }
 }
     break;
 case 7:
-#line 113 "dcParser.yxx"
+#line 118 "dcParser.yxx"
 {
   DCFile::ClassesByName::const_iterator ni;
   ni = dc_file->_classes_by_name.find(yyvsp[0].str);
@@ -1066,49 +1071,49 @@ case 7:
 }
     break;
 case 9:
-#line 128 "dcParser.yxx"
+#line 133 "dcParser.yxx"
 {
   yyval.str = yyvsp[-2].str + string("/") + yyvsp[0].str;
 }
     break;
 case 11:
-#line 136 "dcParser.yxx"
+#line 141 "dcParser.yxx"
 {
   yyval.str = yyvsp[-2].str + string(".") + yyvsp[0].str;
 }
     break;
 case 12:
-#line 143 "dcParser.yxx"
+#line 148 "dcParser.yxx"
 {
   dc_file->add_import_module(yyvsp[0].str);
 }
     break;
 case 13:
-#line 147 "dcParser.yxx"
+#line 152 "dcParser.yxx"
 {
   dc_file->add_import_module(yyvsp[-1].str);
 }
     break;
 case 16:
-#line 156 "dcParser.yxx"
+#line 161 "dcParser.yxx"
 {
   dc_file->add_import_symbol("*");
 }
     break;
 case 17:
-#line 163 "dcParser.yxx"
+#line 168 "dcParser.yxx"
 {
   dc_file->add_import_symbol(yyvsp[0].str);
 }
     break;
 case 18:
-#line 167 "dcParser.yxx"
+#line 172 "dcParser.yxx"
 {
   dc_file->add_import_symbol(yyvsp[0].str);
 }
     break;
 case 21:
-#line 179 "dcParser.yxx"
+#line 184 "dcParser.yxx"
 {
   if (yyvsp[0].u.dclass != (DCClass *)NULL) {
     current_class->add_parent(yyvsp[0].u.dclass);
@@ -1116,7 +1121,7 @@ case 21:
 }
     break;
 case 22:
-#line 185 "dcParser.yxx"
+#line 190 "dcParser.yxx"
 {
   if (yyvsp[0].u.dclass != (DCClass *)NULL) {
     current_class->add_parent(yyvsp[0].u.dclass);
@@ -1124,7 +1129,7 @@ case 22:
 }
     break;
 case 27:
-#line 201 "dcParser.yxx"
+#line 206 "dcParser.yxx"
 {
   current_atomic = new DCAtomicField(yyvsp[-1].str);
   if (!current_class->add_field(current_atomic)) {
@@ -1133,7 +1138,7 @@ case 27:
 }
     break;
 case 29:
-#line 212 "dcParser.yxx"
+#line 217 "dcParser.yxx"
 {
   DCField *field = current_class->get_field_by_name(yyvsp[0].str);
   yyval.u.atomic = (DCAtomicField *)NULL;
@@ -1148,32 +1153,32 @@ case 29:
 }
     break;
 case 34:
-#line 238 "dcParser.yxx"
+#line 243 "dcParser.yxx"
 {
   atomic_element = DCAtomicField::ElementType();
   atomic_element._type = yyvsp[0].u.subatomic;
 }
     break;
 case 35:
-#line 243 "dcParser.yxx"
+#line 248 "dcParser.yxx"
 {
   current_atomic->_elements.push_back(atomic_element);
 }
     break;
 case 37:
-#line 251 "dcParser.yxx"
+#line 256 "dcParser.yxx"
 {
   atomic_element._divisor = yyvsp[0].u.integer;
 }
     break;
 case 38:
-#line 255 "dcParser.yxx"
+#line 260 "dcParser.yxx"
 {
   atomic_element._name = yyvsp[0].str;
 }
     break;
 case 39:
-#line 259 "dcParser.yxx"
+#line 264 "dcParser.yxx"
 {
   if (!atomic_element.set_default_value(yyvsp[0].u.integer)) {
     yyerror("Invalid default value: " + yyvsp[0].str);
@@ -1181,7 +1186,7 @@ case 39:
 }
     break;
 case 40:
-#line 265 "dcParser.yxx"
+#line 270 "dcParser.yxx"
 {
   if (!atomic_element.set_default_value(yyvsp[0].u.real)) {
     yyerror("Invalid default value: " + yyvsp[0].str);
@@ -1189,7 +1194,7 @@ case 40:
 }
     break;
 case 41:
-#line 271 "dcParser.yxx"
+#line 276 "dcParser.yxx"
 {
   if (!atomic_element.set_default_value(yyvsp[0].str)) {
     yyerror("Invalid default value: \"" + yyvsp[0].str + "\"");
@@ -1197,7 +1202,7 @@ case 41:
 }
     break;
 case 42:
-#line 277 "dcParser.yxx"
+#line 282 "dcParser.yxx"
 {
   if (!atomic_element.set_default_value_literal(yyvsp[0].str)) {
     yyerror("Invalid default hex string value");
@@ -1205,7 +1210,7 @@ case 42:
 }
     break;
 case 43:
-#line 283 "dcParser.yxx"
+#line 288 "dcParser.yxx"
 {
   if (!atomic_element.end_array()) {
     yyerror("Array default value inappropriate");
@@ -1215,7 +1220,7 @@ case 43:
 }
     break;
 case 50:
-#line 309 "dcParser.yxx"
+#line 314 "dcParser.yxx"
 {
   if (!atomic_element.add_default_value(yyvsp[0].u.integer)) {
     yyerror("Invalid default value: " + yyvsp[0].str);
@@ -1223,7 +1228,7 @@ case 50:
 }
     break;
 case 51:
-#line 315 "dcParser.yxx"
+#line 320 "dcParser.yxx"
 {
   if (!atomic_element.add_default_value(yyvsp[0].u.real)) {
     yyerror("Invalid default value: " + yyvsp[0].str);
@@ -1231,7 +1236,7 @@ case 51:
 }
     break;
 case 52:
-#line 321 "dcParser.yxx"
+#line 326 "dcParser.yxx"
 {
   if (!atomic_element.add_default_value(yyvsp[0].str)) {
     yyerror("Invalid default value: " + yyvsp[0].str);
@@ -1239,7 +1244,7 @@ case 52:
 }
     break;
 case 53:
-#line 327 "dcParser.yxx"
+#line 332 "dcParser.yxx"
 {
   if (!atomic_element.add_default_value_literal(yyvsp[0].str)) {
     yyerror("Invalid hex literal in default array");
@@ -1247,7 +1252,7 @@ case 53:
 }
     break;
 case 54:
-#line 333 "dcParser.yxx"
+#line 338 "dcParser.yxx"
 {
   for (int i = 0; i < yyvsp[0].u.integer; i++) {
     if (!atomic_element.add_default_value(yyvsp[-2].u.integer)) {
@@ -1258,7 +1263,7 @@ case 54:
 }
     break;
 case 55:
-#line 342 "dcParser.yxx"
+#line 347 "dcParser.yxx"
 {
   for (int i = 0; i < yyvsp[0].u.integer; i++) {
     if (!atomic_element.add_default_value(yyvsp[-2].u.real)) {
@@ -1269,7 +1274,7 @@ case 55:
 }
     break;
 case 56:
-#line 351 "dcParser.yxx"
+#line 356 "dcParser.yxx"
 {
   for (int i = 0; i < yyvsp[0].u.integer; i++) {
     if (!atomic_element.add_default_value_literal(yyvsp[-2].str)) {
@@ -1280,175 +1285,175 @@ case 56:
 }
     break;
 case 57:
-#line 363 "dcParser.yxx"
+#line 368 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_int8;
 }
     break;
 case 58:
-#line 367 "dcParser.yxx"
+#line 372 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_int16;
 }
     break;
 case 59:
-#line 371 "dcParser.yxx"
+#line 376 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_int32;
 }
     break;
 case 60:
-#line 375 "dcParser.yxx"
+#line 380 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_int64;
 }
     break;
 case 61:
-#line 379 "dcParser.yxx"
+#line 384 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_uint8;
 }
     break;
 case 62:
-#line 383 "dcParser.yxx"
+#line 388 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_uint16;
 }
     break;
 case 63:
-#line 387 "dcParser.yxx"
+#line 392 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_uint32;
 }
     break;
 case 64:
-#line 391 "dcParser.yxx"
+#line 396 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_uint64;
 }
     break;
 case 65:
-#line 395 "dcParser.yxx"
+#line 400 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_float64;
 }
     break;
 case 66:
-#line 399 "dcParser.yxx"
+#line 404 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_string;
 }
     break;
 case 67:
-#line 403 "dcParser.yxx"
+#line 408 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_blob;
 }
     break;
 case 68:
-#line 407 "dcParser.yxx"
+#line 412 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_blob32;
 }
     break;
 case 69:
-#line 411 "dcParser.yxx"
+#line 416 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_int8array;
 }
     break;
 case 70:
-#line 415 "dcParser.yxx"
+#line 420 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_int16array;
 }
     break;
 case 71:
-#line 419 "dcParser.yxx"
+#line 424 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_int32array;
 }
     break;
 case 72:
-#line 423 "dcParser.yxx"
+#line 428 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_uint8array;
 }
     break;
 case 73:
-#line 427 "dcParser.yxx"
+#line 432 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_uint16array;
 }
     break;
 case 74:
-#line 431 "dcParser.yxx"
+#line 436 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_uint32array;
 }
     break;
 case 75:
-#line 435 "dcParser.yxx"
+#line 440 "dcParser.yxx"
 {
   yyval.u.subatomic = ST_uint32uint8array;
 }
     break;
 case 77:
-#line 443 "dcParser.yxx"
+#line 448 "dcParser.yxx"
 {
   current_atomic->_flags |= DCAtomicField::F_required;
 }
     break;
 case 78:
-#line 447 "dcParser.yxx"
+#line 452 "dcParser.yxx"
 {
   current_atomic->_flags |= DCAtomicField::F_broadcast;
 }
     break;
 case 79:
-#line 451 "dcParser.yxx"
+#line 456 "dcParser.yxx"
 {
   current_atomic->_flags |= DCAtomicField::F_p2p;
 }
     break;
 case 80:
-#line 455 "dcParser.yxx"
+#line 460 "dcParser.yxx"
 {
   current_atomic->_flags |= DCAtomicField::F_ram;
 }
     break;
 case 81:
-#line 459 "dcParser.yxx"
+#line 464 "dcParser.yxx"
 {
   current_atomic->_flags |= DCAtomicField::F_db;
 }
     break;
 case 82:
-#line 463 "dcParser.yxx"
+#line 468 "dcParser.yxx"
 {
   current_atomic->_flags |= DCAtomicField::F_clsend;
 }
     break;
 case 83:
-#line 467 "dcParser.yxx"
+#line 472 "dcParser.yxx"
 {
   current_atomic->_flags |= DCAtomicField::F_clrecv;
 }
     break;
 case 84:
-#line 471 "dcParser.yxx"
+#line 476 "dcParser.yxx"
 {
   current_atomic->_flags |= DCAtomicField::F_ownsend;
 }
     break;
 case 85:
-#line 475 "dcParser.yxx"
+#line 480 "dcParser.yxx"
 {
   current_atomic->_flags |= DCAtomicField::F_airecv;
 }
     break;
 case 86:
-#line 482 "dcParser.yxx"
+#line 487 "dcParser.yxx"
 {
   current_molecular = new DCMolecularField(yyvsp[-1].str);
   if (!current_class->add_field(current_molecular)) {
@@ -1457,7 +1462,7 @@ case 86:
 }
     break;
 case 88:
-#line 493 "dcParser.yxx"
+#line 498 "dcParser.yxx"
 {
   if (yyvsp[0].u.atomic != (DCAtomicField *)NULL) {
     current_molecular->_fields.push_back(yyvsp[0].u.atomic);
@@ -1465,7 +1470,7 @@ case 88:
 }
     break;
 case 89:
-#line 499 "dcParser.yxx"
+#line 504 "dcParser.yxx"
 {
   if (yyvsp[0].u.atomic != (DCAtomicField *)NULL) {
     current_molecular->_fields.push_back(yyvsp[0].u.atomic);
@@ -1710,4 +1715,4 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 513 "dcParser.yxx"
+#line 518 "dcParser.yxx"

+ 6 - 1
direct/src/dcparser/dcParser.yxx

@@ -102,7 +102,12 @@ dclass:
 {
   current_class = new DCClass($2);
   if (!dc_file->add_class(current_class)) {
-    yyerror("Duplicate class name: " + current_class->get_name());
+    DCClass *old_class = dc_file->get_class_by_name(current_class->get_name());
+    if (old_class->is_bogus_class()) {
+      yyerror("Base class defined after its first reference: " + current_class->get_name());
+    } else {
+      yyerror("Duplicate class name: " + current_class->get_name());
+    }
   }
 }
         dclass_derivation '{' dclass_fields '}'