fix error messages when dc files loaded out of order

This commit is contained in:
David Rose 2004-06-12 02:21:21 +00:00
parent 081122fe3b
commit 65f0fa0409
2 changed files with 82 additions and 72 deletions

View File

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

View File

@ -102,7 +102,12 @@ dclass:
{ {
current_class = new DCClass($2); current_class = new DCClass($2);
if (!dc_file->add_class(current_class)) { 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 '}' dclass_derivation '{' dclass_fields '}'