00001 #include "xrb_datafileparser.h"
00002
00003 #include <cstdio>
00004 #include <iomanip>
00005 #include <iostream>
00006
00007 #define DEBUG_SPEW_1(x) if (m_debug_spew_level >= 1) std::cerr << x
00008 #define DEBUG_SPEW_2(x) if (m_debug_spew_level >= 2) std::cerr << x
00009
00010
00011 #line 69 "xrb_datafileparser.trison"
00012
00013 #include <sstream>
00014
00015 #include "xrb_datafilelocation.hpp"
00016 #include "xrb_datafilescanner.hpp"
00017 #include "xrb_datafilevalue.hpp"
00018
00019 #undef FL
00020 #define FL DataFileLocation(m_scanner->InputPath(), m_scanner->LineNumber())
00021
00022 namespace Xrb
00023 {
00024
00025 #line 26 "xrb_datafileparser.cpp"
00026
00027 DataFileParser::DataFileParser ()
00028
00029 {
00030
00031 #line 83 "xrb_datafileparser.trison"
00032
00033 m_scanner = new DataFileScanner();
00034
00035 #line 36 "xrb_datafileparser.cpp"
00036 m_debug_spew_level = 0;
00037 DEBUG_SPEW_2("### number of state transitions = " << ms_state_transition_count << std::endl);
00038 m_reduction_token = NULL;
00039 }
00040
00041 DataFileParser::~DataFileParser ()
00042 {
00043
00044 #line 87 "xrb_datafileparser.trison"
00045
00046 ASSERT1(m_scanner != NULL);
00047 Delete(m_scanner);
00048 delete StealAcceptedStructure();
00049
00050 #line 51 "xrb_datafileparser.cpp"
00051 }
00052
00053 void DataFileParser::CheckStateConsistency ()
00054 {
00055 unsigned int counter = 1;
00056 for (unsigned int i = 0; i < ms_state_count; ++i)
00057 {
00058 if (ms_state[i].m_lookahead_transition_offset > 0)
00059 {
00060 assert(counter == ms_state[i].m_lookahead_transition_offset);
00061 assert(ms_state[i].m_lookahead_transition_count > 0);
00062 }
00063 else
00064 assert(ms_state[i].m_lookahead_transition_count == 0);
00065
00066 counter += ms_state[i].m_lookahead_transition_count;
00067
00068 if (ms_state[i].m_default_action_offset > 0)
00069 ++counter;
00070
00071 if (ms_state[i].m_non_terminal_transition_offset > 0)
00072 {
00073 assert(counter == ms_state[i].m_non_terminal_transition_offset);
00074 assert(ms_state[i].m_non_terminal_transition_offset > 0);
00075 }
00076 else
00077 assert(ms_state[i].m_non_terminal_transition_offset == 0);
00078
00079 counter += ms_state[i].m_non_terminal_transition_count;
00080 }
00081 assert(counter == ms_state_transition_count);
00082 }
00083
00084 DataFileParser::ParserReturnCode DataFileParser::Parse ()
00085 {
00086
00087 #line 93 "xrb_datafileparser.trison"
00088
00089 delete StealAcceptedStructure();
00090
00091 #line 92 "xrb_datafileparser.cpp"
00092
00093 ParserReturnCode return_code = PrivateParse();
00094
00095
00096 #line 97 "xrb_datafileparser.trison"
00097
00098 m_scanner->Close();
00099
00100 #line 101 "xrb_datafileparser.cpp"
00101
00102 return return_code;
00103 }
00104
00105 bool DataFileParser::DoesStateAcceptErrorToken (DataFileParser::StateNumber state_number) const
00106 {
00107 assert(state_number < ms_state_count);
00108 State const &state = ms_state[state_number];
00109
00110 for (unsigned int transition = state.m_lookahead_transition_offset,
00111 transition_end = state.m_lookahead_transition_offset +
00112 state.m_lookahead_transition_count;
00113 transition < transition_end;
00114 ++transition)
00115 {
00116 if (ms_state_transition[transition].m_token_type == Token::ERROR_)
00117 return true;
00118 }
00119
00120 return false;
00121 }
00122
00123 DataFileParser::ParserReturnCode DataFileParser::PrivateParse ()
00124 {
00125 m_state_stack.clear();
00126 m_token_stack.clear();
00127
00128 m_lookahead_token_type = Token::INVALID_;
00129 m_lookahead_token = NULL;
00130 m_is_new_lookahead_token_required = true;
00131
00132 m_saved_lookahead_token_type = Token::INVALID_;
00133 m_get_new_lookahead_token_type_from_saved = false;
00134 m_previous_transition_accepted_error_token = false;
00135
00136 m_is_returning_with_non_terminal = false;
00137 m_returning_with_this_non_terminal = Token::INVALID_;
00138
00139
00140 PushState(0);
00141
00142 while (true)
00143 {
00144 StateNumber current_state_number = m_state_stack.back();
00145 assert(current_state_number < ms_state_count);
00146 State const ¤t_state = ms_state[current_state_number];
00147
00148 unsigned int state_transition_number;
00149 unsigned int state_transition_count;
00150 unsigned int default_action_state_transition_number;
00151 Token::Type state_transition_token_type = Token::INVALID_;
00152
00153
00154
00155 if (m_is_returning_with_non_terminal)
00156 {
00157 m_is_returning_with_non_terminal = false;
00158 state_transition_number = current_state.m_non_terminal_transition_offset;
00159 state_transition_count = current_state.m_non_terminal_transition_count;
00160 default_action_state_transition_number = 0;
00161 state_transition_token_type = m_returning_with_this_non_terminal;
00162 }
00163
00164 else
00165 {
00166 state_transition_number = current_state.m_lookahead_transition_offset;
00167 state_transition_count = current_state.m_lookahead_transition_count;
00168 default_action_state_transition_number = current_state.m_default_action_offset;
00169
00170
00171 if (state_transition_count != 0)
00172 {
00173 state_transition_token_type = LookaheadTokenType();
00174 DEBUG_SPEW_1("*** lookahead token type: " << state_transition_token_type << std::endl);
00175 }
00176 }
00177
00178 unsigned int i;
00179 for (i = 0;
00180 i < state_transition_count;
00181 ++i, ++state_transition_number)
00182 {
00183 StateTransition const &state_transition =
00184 ms_state_transition[state_transition_number];
00185
00186 if (state_transition.m_token_type == state_transition_token_type)
00187 {
00188 if (state_transition.m_token_type == Token::ERROR_)
00189 m_previous_transition_accepted_error_token = true;
00190 else
00191 m_previous_transition_accepted_error_token = false;
00192
00193 PrintStateTransition(state_transition_number);
00194 if (ProcessAction(state_transition.m_action) == ARC_ACCEPT_AND_RETURN)
00195 return PRC_SUCCESS;
00196 else
00197 break;
00198 }
00199 }
00200
00201
00202 if (i == state_transition_count)
00203 {
00204
00205 if (default_action_state_transition_number != 0)
00206 {
00207 PrintStateTransition(default_action_state_transition_number);
00208 Action const &default_action =
00209 ms_state_transition[default_action_state_transition_number].m_action;
00210 if (ProcessAction(default_action) == ARC_ACCEPT_AND_RETURN)
00211 return PRC_SUCCESS;
00212 }
00213
00214 else
00215 {
00216 assert(!m_is_new_lookahead_token_required);
00217
00218 DEBUG_SPEW_1("!!! error recovery: begin" << std::endl);
00219
00220
00221
00222 if (DoesStateAcceptErrorToken(current_state_number))
00223 {
00224
00225
00226
00227 if (m_previous_transition_accepted_error_token)
00228 {
00229 ThrowAwayToken(m_lookahead_token);
00230 m_is_new_lookahead_token_required = true;
00231 }
00232
00233
00234
00235 else
00236 {
00237 m_saved_lookahead_token_type = m_lookahead_token_type;
00238 m_get_new_lookahead_token_type_from_saved = true;
00239 m_lookahead_token_type = Token::ERROR_;
00240 }
00241 }
00242
00243 else
00244 {
00245
00246 m_saved_lookahead_token_type = m_lookahead_token_type;
00247 m_get_new_lookahead_token_type_from_saved = true;
00248 m_lookahead_token_type = Token::ERROR_;
00249
00250
00251
00252 assert(m_state_stack.size() > 0);
00253 do
00254 {
00255 DEBUG_SPEW_1("!!! error recovery: popping state " << current_state_number << std::endl);
00256 m_state_stack.pop_back();
00257
00258 if (m_state_stack.size() == 0)
00259 {
00260 ThrowAwayTokenStack();
00261 DEBUG_SPEW_1("!!! error recovery: unhandled error -- quitting" << std::endl);
00262 return PRC_UNHANDLED_PARSE_ERROR;
00263 }
00264
00265 assert(m_token_stack.size() > 0);
00266 ThrowAwayToken(m_token_stack.back());
00267 m_token_stack.pop_back();
00268 current_state_number = m_state_stack.back();
00269 }
00270 while (!DoesStateAcceptErrorToken(current_state_number));
00271 }
00272
00273 DEBUG_SPEW_1("!!! error recovery: found state which accepts %error token" << std::endl);
00274 PrintStateStack();
00275 }
00276 }
00277 }
00278
00279
00280 return PRC_UNHANDLED_PARSE_ERROR;
00281 }
00282
00283 DataFileParser::ActionReturnCode DataFileParser::ProcessAction (DataFileParser::Action const &action)
00284 {
00285 if (action.m_transition_action == TA_SHIFT_AND_PUSH_STATE)
00286 {
00287 ShiftLookaheadToken();
00288 PushState(action.m_data);
00289 }
00290 else if (action.m_transition_action == TA_PUSH_STATE)
00291 {
00292 PushState(action.m_data);
00293 }
00294 else if (action.m_transition_action == TA_REDUCE_USING_RULE)
00295 {
00296 unsigned int reduction_rule_number = action.m_data;
00297 assert(reduction_rule_number < ms_reduction_rule_count);
00298 ReductionRule const &reduction_rule = ms_reduction_rule[reduction_rule_number];
00299 ReduceUsingRule(reduction_rule, false);
00300 }
00301 else if (action.m_transition_action == TA_REDUCE_AND_ACCEPT_USING_RULE)
00302 {
00303 unsigned int reduction_rule_number = action.m_data;
00304 assert(reduction_rule_number < ms_reduction_rule_count);
00305 ReductionRule const &reduction_rule = ms_reduction_rule[reduction_rule_number];
00306 ReduceUsingRule(reduction_rule, true);
00307 DEBUG_SPEW_1("*** accept" << std::endl);
00308
00309 return ARC_ACCEPT_AND_RETURN;
00310 }
00311 else if (action.m_transition_action == TA_THROW_AWAY_LOOKAHEAD_TOKEN)
00312 {
00313 assert(!m_is_new_lookahead_token_required);
00314 ThrowAwayToken(m_lookahead_token);
00315 m_is_new_lookahead_token_required = true;
00316 }
00317
00318 return ARC_CONTINUE_PARSING;
00319 }
00320
00321 void DataFileParser::ShiftLookaheadToken ()
00322 {
00323 assert(m_lookahead_token_type != Token::DEFAULT_);
00324 assert(m_lookahead_token_type != Token::INVALID_);
00325 DEBUG_SPEW_1("*** shifting lookahead token -- type " << m_lookahead_token_type << std::endl);
00326 m_token_stack.push_back(m_lookahead_token);
00327 m_is_new_lookahead_token_required = true;
00328 }
00329
00330 void DataFileParser::PushState (StateNumber const state_number)
00331 {
00332 assert(state_number < ms_state_count);
00333
00334 DEBUG_SPEW_1("*** going to state " << state_number << std::endl);
00335 m_state_stack.push_back(state_number);
00336 PrintStateStack();
00337 }
00338
00339 void DataFileParser::ReduceUsingRule (ReductionRule const &reduction_rule, bool and_accept)
00340 {
00341 if (and_accept)
00342 {
00343 assert(reduction_rule.m_number_of_tokens_to_reduce_by == m_state_stack.size() - 1);
00344 assert(reduction_rule.m_number_of_tokens_to_reduce_by == m_token_stack.size());
00345 }
00346 else
00347 {
00348 assert(reduction_rule.m_number_of_tokens_to_reduce_by < m_state_stack.size());
00349 assert(reduction_rule.m_number_of_tokens_to_reduce_by <= m_token_stack.size());
00350 }
00351
00352 DEBUG_SPEW_1("*** reducing: " << reduction_rule.m_description << std::endl);
00353
00354 m_is_returning_with_non_terminal = true;
00355 m_returning_with_this_non_terminal = reduction_rule.m_non_terminal_to_reduce_to;
00356 m_reduction_rule_token_count = reduction_rule.m_number_of_tokens_to_reduce_by;
00357
00358
00359 if (reduction_rule.m_handler != NULL)
00360 m_reduction_token = (this->*(reduction_rule.m_handler))();
00361
00362 PopStates(reduction_rule.m_number_of_tokens_to_reduce_by, false);
00363
00364
00365 if (!and_accept)
00366 {
00367
00368 m_token_stack.push_back(m_reduction_token);
00369 PrintStateStack();
00370 }
00371 }
00372
00373 void DataFileParser::PopStates (unsigned int number_of_states_to_pop, bool print_state_stack)
00374 {
00375 assert(number_of_states_to_pop < m_state_stack.size());
00376 assert(number_of_states_to_pop <= m_token_stack.size());
00377
00378 while (number_of_states_to_pop-- > 0)
00379 {
00380 m_state_stack.pop_back();
00381 m_token_stack.pop_back();
00382 }
00383
00384 if (print_state_stack)
00385 PrintStateStack();
00386 }
00387
00388 void DataFileParser::PrintStateStack () const
00389 {
00390 DEBUG_SPEW_2("*** state stack: ");
00391 for (StateStack::const_iterator it = m_state_stack.begin(),
00392 it_end = m_state_stack.end();
00393 it != it_end;
00394 ++it)
00395 {
00396 DEBUG_SPEW_2(*it << " ");
00397 }
00398 DEBUG_SPEW_2(std::endl);
00399 }
00400
00401 void DataFileParser::PrintStateTransition (unsigned int const state_transition_number) const
00402 {
00403 assert(state_transition_number < ms_state_transition_count);
00404 DEBUG_SPEW_2("&&& exercising state transition " << std::setw(4) << std::right << state_transition_number << std::endl);
00405 }
00406
00407 void DataFileParser::ScanANewLookaheadToken ()
00408 {
00409 assert(!m_is_new_lookahead_token_required);
00410 m_lookahead_token = NULL;
00411 m_lookahead_token_type = Scan();
00412 DEBUG_SPEW_1("*** scanned a new lookahead token -- type " << m_lookahead_token_type << std::endl);
00413 }
00414
00415 void DataFileParser::ThrowAwayToken (DataFileValue * token)
00416 {
00417
00418 #line 101 "xrb_datafileparser.trison"
00419
00420 Delete(token);
00421
00422 #line 423 "xrb_datafileparser.cpp"
00423 }
00424
00425 void DataFileParser::ThrowAwayTokenStack ()
00426 {
00427 while (!m_token_stack.empty())
00428 {
00429 ThrowAwayToken(m_token_stack.back());
00430 m_token_stack.pop_back();
00431 }
00432 }
00433
00434 std::ostream &operator << (std::ostream &stream, DataFileParser::Token::Type token_type)
00435 {
00436 static std::string const s_token_type_string[] =
00437 {
00438 "BAD_TOKEN",
00439 "BOOLEAN",
00440 "CHARACTER",
00441 "FLOAT",
00442 "IDENTIFIER",
00443 "SINT32",
00444 "STRING_FRAGMENT",
00445 "UINT32",
00446 "END_",
00447
00448 "array",
00449 "data_file",
00450 "element",
00451 "element_list",
00452 "string",
00453 "structure",
00454 "value",
00455 "value_list",
00456 "START_",
00457
00458 "%error",
00459 "DEFAULT_",
00460 "INVALID_"
00461 };
00462 static unsigned int const s_token_type_string_count =
00463 sizeof(s_token_type_string) /
00464 sizeof(std::string);
00465
00466 unsigned token_type_value = static_cast<unsigned int>(token_type);
00467 if (token_type_value < 0x20)
00468 stream << token_type_value;
00469 else if (token_type_value < 0x7F)
00470 stream << "'" << static_cast<char>(token_type) << "'";
00471 else if (token_type_value < 0x100)
00472 stream << token_type_value;
00473 else if (token_type_value < 0x100 + s_token_type_string_count)
00474 stream << s_token_type_string[token_type_value - 0x100];
00475 else
00476 stream << token_type_value;
00477
00478 return stream;
00479 }
00480
00481
00482
00483
00484
00485
00486 DataFileValue * DataFileParser::ReductionRuleHandler0000 ()
00487 {
00488 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00489 return m_token_stack[m_token_stack.size() - m_reduction_rule_token_count];
00490
00491 return NULL;
00492 }
00493
00494
00495 DataFileValue * DataFileParser::ReductionRuleHandler0001 ()
00496 {
00497 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00498 DataFileStructure * element_list = DStaticCast< DataFileStructure * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00499
00500 #line 185 "xrb_datafileparser.trison"
00501
00502 ASSERT1(element_list != NULL);
00503 return element_list;
00504
00505 #line 506 "xrb_datafileparser.cpp"
00506 return NULL;
00507 }
00508
00509
00510 DataFileValue * DataFileParser::ReductionRuleHandler0002 ()
00511 {
00512
00513 #line 191 "xrb_datafileparser.trison"
00514
00515 EmitError(FL, "general syntax error");
00516 return new DataFileStructure();
00517
00518 #line 519 "xrb_datafileparser.cpp"
00519 return NULL;
00520 }
00521
00522
00523 DataFileValue * DataFileParser::ReductionRuleHandler0003 ()
00524 {
00525 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00526 DataFileStructure * element_list = DStaticCast< DataFileStructure * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00527 assert(static_cast<unsigned int>(1) < m_reduction_rule_token_count);
00528 DataFileKeyPair * element = DStaticCast< DataFileKeyPair * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 1]);
00529
00530 #line 200 "xrb_datafileparser.trison"
00531
00532 ASSERT1(element_list != NULL);
00533
00534 if (element != NULL)
00535 {
00536 try
00537 {
00538 element_list->AddKeyPair(element);
00539 }
00540 catch (std::string const &exception)
00541 {
00542 EmitError(FL, exception);
00543 Delete(element);
00544 }
00545 }
00546 return element_list;
00547
00548 #line 549 "xrb_datafileparser.cpp"
00549 return NULL;
00550 }
00551
00552
00553 DataFileValue * DataFileParser::ReductionRuleHandler0004 ()
00554 {
00555
00556 #line 218 "xrb_datafileparser.trison"
00557
00558 return new DataFileStructure();
00559
00560 #line 561 "xrb_datafileparser.cpp"
00561 return NULL;
00562 }
00563
00564
00565 DataFileValue * DataFileParser::ReductionRuleHandler0005 ()
00566 {
00567 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00568 DataFileString * key = DStaticCast< DataFileString * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00569 assert(static_cast<unsigned int>(1) < m_reduction_rule_token_count);
00570 DataFileValue * value = DStaticCast< DataFileValue * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 1]);
00571
00572 #line 226 "xrb_datafileparser.trison"
00573
00574 ASSERT1(key != NULL);
00575 if (value == NULL)
00576 {
00577 Delete(key);
00578 return NULL;
00579 }
00580
00581 DataFileKeyPair *key_pair = new DataFileKeyPair(key->Value(), value);
00582 Delete(key);
00583 return key_pair;
00584
00585 #line 586 "xrb_datafileparser.cpp"
00586 return NULL;
00587 }
00588
00589
00590 DataFileValue * DataFileParser::ReductionRuleHandler0006 ()
00591 {
00592 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00593 DataFileString * key = DStaticCast< DataFileString * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00594
00595 #line 240 "xrb_datafileparser.trison"
00596
00597 ASSERT1(key != NULL);
00598 std::ostringstream out;
00599 out << "syntax error in element with key \"" << key->Value() << "\"";
00600 EmitError(FL, out.str());
00601 Delete(key);
00602 return NULL;
00603
00604 #line 605 "xrb_datafileparser.cpp"
00605 return NULL;
00606 }
00607
00608
00609 DataFileValue * DataFileParser::ReductionRuleHandler0007 ()
00610 {
00611
00612 #line 250 "xrb_datafileparser.trison"
00613
00614 EmitError(FL, "syntax error in element");
00615 return NULL;
00616
00617 #line 618 "xrb_datafileparser.cpp"
00618 return NULL;
00619 }
00620
00621
00622 DataFileValue * DataFileParser::ReductionRuleHandler0008 ()
00623 {
00624 assert(static_cast<unsigned int>(1) < m_reduction_rule_token_count);
00625 DataFileStructure * element_list = DStaticCast< DataFileStructure * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 1]);
00626
00627 #line 259 "xrb_datafileparser.trison"
00628
00629 ASSERT1(element_list != NULL);
00630 return element_list;
00631
00632 #line 633 "xrb_datafileparser.cpp"
00633 return NULL;
00634 }
00635
00636
00637 DataFileValue * DataFileParser::ReductionRuleHandler0009 ()
00638 {
00639
00640 #line 265 "xrb_datafileparser.trison"
00641
00642 EmitError(FL, "syntax error in structure");
00643 return new DataFileStructure();
00644
00645 #line 646 "xrb_datafileparser.cpp"
00646 return NULL;
00647 }
00648
00649
00650 DataFileValue * DataFileParser::ReductionRuleHandler0010 ()
00651 {
00652 assert(static_cast<unsigned int>(1) < m_reduction_rule_token_count);
00653 DataFileArray * value_list = DStaticCast< DataFileArray * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 1]);
00654
00655 #line 274 "xrb_datafileparser.trison"
00656
00657 ASSERT1(value_list != NULL);
00658 return value_list;
00659
00660 #line 661 "xrb_datafileparser.cpp"
00661 return NULL;
00662 }
00663
00664
00665 DataFileValue * DataFileParser::ReductionRuleHandler0011 ()
00666 {
00667 assert(static_cast<unsigned int>(1) < m_reduction_rule_token_count);
00668 DataFileArray * value_list = DStaticCast< DataFileArray * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 1]);
00669
00670 #line 280 "xrb_datafileparser.trison"
00671
00672 ASSERT1(value_list != NULL);
00673 return value_list;
00674
00675 #line 676 "xrb_datafileparser.cpp"
00676 return NULL;
00677 }
00678
00679
00680 DataFileValue * DataFileParser::ReductionRuleHandler0012 ()
00681 {
00682
00683 #line 286 "xrb_datafileparser.trison"
00684
00685 return new DataFileArray();
00686
00687 #line 688 "xrb_datafileparser.cpp"
00688 return NULL;
00689 }
00690
00691
00692 DataFileValue * DataFileParser::ReductionRuleHandler0013 ()
00693 {
00694
00695 #line 291 "xrb_datafileparser.trison"
00696
00697 EmitError(FL, "syntax error in array");
00698 return NULL;
00699
00700 #line 701 "xrb_datafileparser.cpp"
00701 return NULL;
00702 }
00703
00704
00705 DataFileValue * DataFileParser::ReductionRuleHandler0014 ()
00706 {
00707 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00708 DataFileArray * value_list = DStaticCast< DataFileArray * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00709 assert(static_cast<unsigned int>(2) < m_reduction_rule_token_count);
00710 DataFileValue * value = DStaticCast< DataFileValue * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 2]);
00711
00712 #line 300 "xrb_datafileparser.trison"
00713
00714 ASSERT1(value_list != NULL);
00715 if (value != NULL)
00716 {
00717 try
00718 {
00719 value_list->AppendValue(value);
00720 }
00721 catch (std::string const &exception)
00722 {
00723 EmitError(FL, exception);
00724 Delete(value);
00725 }
00726 }
00727 return value_list;
00728
00729 #line 730 "xrb_datafileparser.cpp"
00730 return NULL;
00731 }
00732
00733
00734 DataFileValue * DataFileParser::ReductionRuleHandler0015 ()
00735 {
00736 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00737 DataFileValue * value = DStaticCast< DataFileValue * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00738
00739 #line 318 "xrb_datafileparser.trison"
00740
00741 DataFileArray *value_list = new DataFileArray();
00742 if (value != NULL)
00743 {
00744 try
00745 {
00746 value_list->AppendValue(value);
00747 }
00748 catch (std::string const &)
00749 {
00750 ASSERT1(false && "this should never happen");
00751 Delete(value);
00752 }
00753 }
00754 return value_list;
00755
00756 #line 757 "xrb_datafileparser.cpp"
00757 return NULL;
00758 }
00759
00760
00761 DataFileValue * DataFileParser::ReductionRuleHandler0016 ()
00762 {
00763 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00764 DataFileBoolean * value = DStaticCast< DataFileBoolean * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00765
00766 #line 339 "xrb_datafileparser.trison"
00767
00768 return value;
00769
00770 #line 771 "xrb_datafileparser.cpp"
00771 return NULL;
00772 }
00773
00774
00775 DataFileValue * DataFileParser::ReductionRuleHandler0017 ()
00776 {
00777 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00778 DataFileSint32 * value = DStaticCast< DataFileSint32 * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00779
00780 #line 344 "xrb_datafileparser.trison"
00781
00782 return value;
00783
00784 #line 785 "xrb_datafileparser.cpp"
00785 return NULL;
00786 }
00787
00788
00789 DataFileValue * DataFileParser::ReductionRuleHandler0018 ()
00790 {
00791 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00792 DataFileUint32 * value = DStaticCast< DataFileUint32 * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00793
00794 #line 349 "xrb_datafileparser.trison"
00795
00796 return value;
00797
00798 #line 799 "xrb_datafileparser.cpp"
00799 return NULL;
00800 }
00801
00802
00803 DataFileValue * DataFileParser::ReductionRuleHandler0019 ()
00804 {
00805 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00806 DataFileFloat * value = DStaticCast< DataFileFloat * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00807
00808 #line 354 "xrb_datafileparser.trison"
00809
00810 return value;
00811
00812 #line 813 "xrb_datafileparser.cpp"
00813 return NULL;
00814 }
00815
00816
00817 DataFileValue * DataFileParser::ReductionRuleHandler0020 ()
00818 {
00819 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00820 DataFileCharacter * value = DStaticCast< DataFileCharacter * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00821
00822 #line 359 "xrb_datafileparser.trison"
00823
00824 return value;
00825
00826 #line 827 "xrb_datafileparser.cpp"
00827 return NULL;
00828 }
00829
00830
00831 DataFileValue * DataFileParser::ReductionRuleHandler0021 ()
00832 {
00833 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00834 DataFileString * value = DStaticCast< DataFileString * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00835
00836 #line 364 "xrb_datafileparser.trison"
00837
00838 return value;
00839
00840 #line 841 "xrb_datafileparser.cpp"
00841 return NULL;
00842 }
00843
00844
00845 DataFileValue * DataFileParser::ReductionRuleHandler0022 ()
00846 {
00847 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00848 DataFileStructure * value = DStaticCast< DataFileStructure * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00849
00850 #line 369 "xrb_datafileparser.trison"
00851
00852 return value;
00853
00854 #line 855 "xrb_datafileparser.cpp"
00855 return NULL;
00856 }
00857
00858
00859 DataFileValue * DataFileParser::ReductionRuleHandler0023 ()
00860 {
00861 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00862 DataFileArray * value = DStaticCast< DataFileArray * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00863
00864 #line 374 "xrb_datafileparser.trison"
00865
00866 return value;
00867
00868 #line 869 "xrb_datafileparser.cpp"
00869 return NULL;
00870 }
00871
00872
00873 DataFileValue * DataFileParser::ReductionRuleHandler0024 ()
00874 {
00875 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00876 DataFileString * string = DStaticCast< DataFileString * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00877 assert(static_cast<unsigned int>(2) < m_reduction_rule_token_count);
00878 DataFileString * string_fragment = DStaticCast< DataFileString * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 2]);
00879
00880 #line 390 "xrb_datafileparser.trison"
00881
00882 ASSERT1(string != NULL);
00883 ASSERT1(string_fragment != NULL);
00884 string->AppendString(string_fragment->Value());
00885 Delete(string_fragment);
00886 return string;
00887
00888 #line 889 "xrb_datafileparser.cpp"
00889 return NULL;
00890 }
00891
00892
00893 DataFileValue * DataFileParser::ReductionRuleHandler0025 ()
00894 {
00895 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00896 DataFileString * string_fragment = DStaticCast< DataFileString * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00897
00898 #line 399 "xrb_datafileparser.trison"
00899
00900 ASSERT1(string_fragment != NULL);
00901 return string_fragment;
00902
00903 #line 904 "xrb_datafileparser.cpp"
00904 return NULL;
00905 }
00906
00907
00908 DataFileValue * DataFileParser::ReductionRuleHandler0026 ()
00909 {
00910 assert(static_cast<unsigned int>(0) < m_reduction_rule_token_count);
00911 DataFileString * string = DStaticCast< DataFileString * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 0]);
00912 assert(static_cast<unsigned int>(1) < m_reduction_rule_token_count);
00913 DataFileString * string_fragment = DStaticCast< DataFileString * >(m_token_stack[m_token_stack.size() - m_reduction_rule_token_count + 1]);
00914
00915 #line 405 "xrb_datafileparser.trison"
00916
00917 ASSERT1(string != NULL);
00918 ASSERT1(string_fragment != NULL);
00919 string->AppendString(string_fragment->Value());
00920 Delete(string_fragment);
00921 EmitError(FL, "use + to concatenate strings (or did you forget a comma?)");
00922 return string;
00923
00924 #line 925 "xrb_datafileparser.cpp"
00925 return NULL;
00926 }
00927
00928
00929
00930
00931
00932
00933
00934 DataFileParser::ReductionRule const DataFileParser::ms_reduction_rule[] =
00935 {
00936 { Token::START_, 2, &DataFileParser::ReductionRuleHandler0000, "rule 0: %start <- data_file END_ "},
00937 { Token::data_file__, 1, &DataFileParser::ReductionRuleHandler0001, "rule 1: data_file <- element_list "},
00938 { Token::data_file__, 1, &DataFileParser::ReductionRuleHandler0002, "rule 2: data_file <- %error "},
00939 { Token::element_list__, 2, &DataFileParser::ReductionRuleHandler0003, "rule 3: element_list <- element_list element "},
00940 { Token::element_list__, 0, &DataFileParser::ReductionRuleHandler0004, "rule 4: element_list <- "},
00941 { Token::element__, 3, &DataFileParser::ReductionRuleHandler0005, "rule 5: element <- IDENTIFIER value ';' "},
00942 { Token::element__, 3, &DataFileParser::ReductionRuleHandler0006, "rule 6: element <- IDENTIFIER %error ';' "},
00943 { Token::element__, 2, &DataFileParser::ReductionRuleHandler0007, "rule 7: element <- %error ';' "},
00944 { Token::structure__, 3, &DataFileParser::ReductionRuleHandler0008, "rule 8: structure <- '{' element_list '}' "},
00945 { Token::structure__, 3, &DataFileParser::ReductionRuleHandler0009, "rule 9: structure <- '{' %error '}' "},
00946 { Token::array__, 3, &DataFileParser::ReductionRuleHandler0010, "rule 10: array <- '[' value_list ']' "},
00947 { Token::array__, 4, &DataFileParser::ReductionRuleHandler0011, "rule 11: array <- '[' value_list ',' ']' "},
00948 { Token::array__, 2, &DataFileParser::ReductionRuleHandler0012, "rule 12: array <- '[' ']' "},
00949 { Token::array__, 3, &DataFileParser::ReductionRuleHandler0013, "rule 13: array <- '[' %error ']' "},
00950 { Token::value_list__, 3, &DataFileParser::ReductionRuleHandler0014, "rule 14: value_list <- value_list ',' value "},
00951 { Token::value_list__, 1, &DataFileParser::ReductionRuleHandler0015, "rule 15: value_list <- value "},
00952 { Token::value__, 1, &DataFileParser::ReductionRuleHandler0016, "rule 16: value <- BOOLEAN "},
00953 { Token::value__, 1, &DataFileParser::ReductionRuleHandler0017, "rule 17: value <- SINT32 "},
00954 { Token::value__, 1, &DataFileParser::ReductionRuleHandler0018, "rule 18: value <- UINT32 "},
00955 { Token::value__, 1, &DataFileParser::ReductionRuleHandler0019, "rule 19: value <- FLOAT "},
00956 { Token::value__, 1, &DataFileParser::ReductionRuleHandler0020, "rule 20: value <- CHARACTER "},
00957 { Token::value__, 1, &DataFileParser::ReductionRuleHandler0021, "rule 21: value <- string "},
00958 { Token::value__, 1, &DataFileParser::ReductionRuleHandler0022, "rule 22: value <- structure "},
00959 { Token::value__, 1, &DataFileParser::ReductionRuleHandler0023, "rule 23: value <- array "},
00960 { Token::string__, 3, &DataFileParser::ReductionRuleHandler0024, "rule 24: string <- string '+' STRING_FRAGMENT "},
00961 { Token::string__, 1, &DataFileParser::ReductionRuleHandler0025, "rule 25: string <- STRING_FRAGMENT "},
00962 { Token::string__, 2, &DataFileParser::ReductionRuleHandler0026, "rule 26: string <- string STRING_FRAGMENT "},
00963
00964
00965 { Token::ERROR_, 1, NULL, "* -> error"}
00966 };
00967
00968 unsigned int const DataFileParser::ms_reduction_rule_count =
00969 sizeof(DataFileParser::ms_reduction_rule) /
00970 sizeof(DataFileParser::ReductionRule);
00971
00972
00973
00974
00975
00976 DataFileParser::State const DataFileParser::ms_state[] =
00977 {
00978 { 1, 4, 0, 5, 2},
00979 { 7, 2, 0, 0, 0},
00980 { 9, 1, 0, 0, 0},
00981 { 10, 3, 0, 13, 1},
00982 { 0, 0, 14, 0, 0},
00983 { 15, 2, 0, 0, 0},
00984 { 17, 9, 0, 26, 4},
00985 { 0, 0, 30, 0, 0},
00986 { 0, 0, 31, 0, 0},
00987 { 32, 2, 0, 0, 0},
00988 { 0, 0, 34, 0, 0},
00989 { 0, 0, 35, 0, 0},
00990 { 0, 0, 36, 0, 0},
00991 { 0, 0, 37, 0, 0},
00992 { 0, 0, 38, 0, 0},
00993 { 0, 0, 39, 0, 0},
00994 { 40, 4, 0, 44, 1},
00995 { 45, 10, 0, 55, 5},
00996 { 0, 0, 60, 0, 0},
00997 { 0, 0, 61, 0, 0},
00998 { 62, 1, 0, 0, 0},
00999 { 63, 2, 65, 0, 0},
01000 { 0, 0, 66, 0, 0},
01001 { 67, 2, 0, 0, 0},
01002 { 69, 3, 0, 72, 1},
01003 { 73, 2, 0, 0, 0},
01004 { 0, 0, 75, 0, 0},
01005 { 76, 2, 0, 0, 0},
01006 { 0, 0, 78, 0, 0},
01007 { 0, 0, 79, 0, 0},
01008 { 0, 0, 80, 0, 0},
01009 { 81, 1, 0, 0, 0},
01010 { 0, 0, 82, 0, 0},
01011 { 0, 0, 83, 0, 0},
01012 { 0, 0, 84, 0, 0},
01013 { 85, 9, 0, 94, 4},
01014 { 0, 0, 98, 0, 0},
01015 { 0, 0, 99, 0, 0},
01016 { 0, 0, 100, 0, 0},
01017 { 0, 0, 101, 0, 0}
01018
01019 };
01020
01021 unsigned int const DataFileParser::ms_state_count =
01022 sizeof(DataFileParser::ms_state) /
01023 sizeof(DataFileParser::State);
01024
01025
01026
01027
01028
01029 DataFileParser::StateTransition const DataFileParser::ms_state_transition[] =
01030 {
01031
01032 { Token::INVALID_, { TA_COUNT, 0}},
01033
01034
01035
01036
01037
01038 { Token::END_, { TA_REDUCE_USING_RULE, 4}},
01039 { Token::ERROR_, { TA_SHIFT_AND_PUSH_STATE, 1}},
01040 { Token::IDENTIFIER, { TA_REDUCE_USING_RULE, 4}},
01041 { static_cast<Token::Type>('}'), { TA_REDUCE_USING_RULE, 4}},
01042
01043 { Token::data_file__, { TA_PUSH_STATE, 2}},
01044 { Token::element_list__, { TA_PUSH_STATE, 3}},
01045
01046
01047
01048
01049
01050 { Token::END_, { TA_REDUCE_USING_RULE, 2}},
01051 { Token::ERROR_, { TA_THROW_AWAY_LOOKAHEAD_TOKEN, 0}},
01052
01053
01054
01055
01056
01057 { Token::END_, { TA_SHIFT_AND_PUSH_STATE, 4}},
01058
01059
01060
01061
01062
01063 { Token::END_, { TA_REDUCE_USING_RULE, 1}},
01064 { Token::ERROR_, { TA_SHIFT_AND_PUSH_STATE, 5}},
01065 { Token::IDENTIFIER, { TA_SHIFT_AND_PUSH_STATE, 6}},
01066
01067 { Token::element__, { TA_PUSH_STATE, 7}},
01068
01069
01070
01071
01072
01073 { Token::DEFAULT_, {TA_REDUCE_AND_ACCEPT_USING_RULE, 0}},
01074
01075
01076
01077
01078
01079 { Token::ERROR_, { TA_THROW_AWAY_LOOKAHEAD_TOKEN, 0}},
01080 { static_cast<Token::Type>(';'), { TA_SHIFT_AND_PUSH_STATE, 8}},
01081
01082
01083
01084
01085
01086 { Token::ERROR_, { TA_SHIFT_AND_PUSH_STATE, 9}},
01087 { Token::BOOLEAN, { TA_SHIFT_AND_PUSH_STATE, 10}},
01088 { Token::SINT32, { TA_SHIFT_AND_PUSH_STATE, 11}},
01089 { Token::UINT32, { TA_SHIFT_AND_PUSH_STATE, 12}},
01090 { Token::FLOAT, { TA_SHIFT_AND_PUSH_STATE, 13}},
01091 { Token::CHARACTER, { TA_SHIFT_AND_PUSH_STATE, 14}},
01092 { Token::STRING_FRAGMENT, { TA_SHIFT_AND_PUSH_STATE, 15}},
01093 { static_cast<Token::Type>('{'), { TA_SHIFT_AND_PUSH_STATE, 16}},
01094 { static_cast<Token::Type>('['), { TA_SHIFT_AND_PUSH_STATE, 17}},
01095
01096 { Token::structure__, { TA_PUSH_STATE, 18}},
01097 { Token::array__, { TA_PUSH_STATE, 19}},
01098 { Token::value__, { TA_PUSH_STATE, 20}},
01099 { Token::string__, { TA_PUSH_STATE, 21}},
01100
01101
01102
01103
01104
01105 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 3}},
01106
01107
01108
01109
01110
01111 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 7}},
01112
01113
01114
01115
01116
01117 { Token::ERROR_, { TA_THROW_AWAY_LOOKAHEAD_TOKEN, 0}},
01118 { static_cast<Token::Type>(';'), { TA_SHIFT_AND_PUSH_STATE, 22}},
01119
01120
01121
01122
01123
01124 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 16}},
01125
01126
01127
01128
01129
01130 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 17}},
01131
01132
01133
01134
01135
01136 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 18}},
01137
01138
01139
01140
01141
01142 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 19}},
01143
01144
01145
01146
01147
01148 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 20}},
01149
01150
01151
01152
01153
01154 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 25}},
01155
01156
01157
01158
01159
01160 { Token::END_, { TA_REDUCE_USING_RULE, 4}},
01161 { Token::ERROR_, { TA_SHIFT_AND_PUSH_STATE, 23}},
01162 { Token::IDENTIFIER, { TA_REDUCE_USING_RULE, 4}},
01163 { static_cast<Token::Type>('}'), { TA_REDUCE_USING_RULE, 4}},
01164
01165 { Token::element_list__, { TA_PUSH_STATE, 24}},
01166
01167
01168
01169
01170
01171 { Token::ERROR_, { TA_SHIFT_AND_PUSH_STATE, 25}},
01172 { Token::BOOLEAN, { TA_SHIFT_AND_PUSH_STATE, 10}},
01173 { Token::SINT32, { TA_SHIFT_AND_PUSH_STATE, 11}},
01174 { Token::UINT32, { TA_SHIFT_AND_PUSH_STATE, 12}},
01175 { Token::FLOAT, { TA_SHIFT_AND_PUSH_STATE, 13}},
01176 { Token::CHARACTER, { TA_SHIFT_AND_PUSH_STATE, 14}},
01177 { Token::STRING_FRAGMENT, { TA_SHIFT_AND_PUSH_STATE, 15}},
01178 { static_cast<Token::Type>('{'), { TA_SHIFT_AND_PUSH_STATE, 16}},
01179 { static_cast<Token::Type>('['), { TA_SHIFT_AND_PUSH_STATE, 17}},
01180 { static_cast<Token::Type>(']'), { TA_SHIFT_AND_PUSH_STATE, 26}},
01181
01182 { Token::structure__, { TA_PUSH_STATE, 18}},
01183 { Token::array__, { TA_PUSH_STATE, 19}},
01184 { Token::value_list__, { TA_PUSH_STATE, 27}},
01185 { Token::value__, { TA_PUSH_STATE, 28}},
01186 { Token::string__, { TA_PUSH_STATE, 21}},
01187
01188
01189
01190
01191
01192 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 22}},
01193
01194
01195
01196
01197
01198 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 23}},
01199
01200
01201
01202
01203
01204 { static_cast<Token::Type>(';'), { TA_SHIFT_AND_PUSH_STATE, 29}},
01205
01206
01207
01208
01209
01210 { Token::STRING_FRAGMENT, { TA_SHIFT_AND_PUSH_STATE, 30}},
01211 { static_cast<Token::Type>('+'), { TA_SHIFT_AND_PUSH_STATE, 31}},
01212
01213 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 21}},
01214
01215
01216
01217
01218
01219 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 6}},
01220
01221
01222
01223
01224
01225 { Token::ERROR_, { TA_THROW_AWAY_LOOKAHEAD_TOKEN, 0}},
01226 { static_cast<Token::Type>('}'), { TA_SHIFT_AND_PUSH_STATE, 32}},
01227
01228
01229
01230
01231
01232 { Token::ERROR_, { TA_SHIFT_AND_PUSH_STATE, 5}},
01233 { Token::IDENTIFIER, { TA_SHIFT_AND_PUSH_STATE, 6}},
01234 { static_cast<Token::Type>('}'), { TA_SHIFT_AND_PUSH_STATE, 33}},
01235
01236 { Token::element__, { TA_PUSH_STATE, 7}},
01237
01238
01239
01240
01241
01242 { Token::ERROR_, { TA_THROW_AWAY_LOOKAHEAD_TOKEN, 0}},
01243 { static_cast<Token::Type>(']'), { TA_SHIFT_AND_PUSH_STATE, 34}},
01244
01245
01246
01247
01248
01249 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 12}},
01250
01251
01252
01253
01254
01255 { static_cast<Token::Type>(','), { TA_SHIFT_AND_PUSH_STATE, 35}},
01256 { static_cast<Token::Type>(']'), { TA_SHIFT_AND_PUSH_STATE, 36}},
01257
01258
01259
01260
01261
01262 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 15}},
01263
01264
01265
01266
01267
01268 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 5}},
01269
01270
01271
01272
01273
01274 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 26}},
01275
01276
01277
01278
01279
01280 { Token::STRING_FRAGMENT, { TA_SHIFT_AND_PUSH_STATE, 37}},
01281
01282
01283
01284
01285
01286 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 9}},
01287
01288
01289
01290
01291
01292 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 8}},
01293
01294
01295
01296
01297
01298 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 13}},
01299
01300
01301
01302
01303
01304 { Token::BOOLEAN, { TA_SHIFT_AND_PUSH_STATE, 10}},
01305 { Token::SINT32, { TA_SHIFT_AND_PUSH_STATE, 11}},
01306 { Token::UINT32, { TA_SHIFT_AND_PUSH_STATE, 12}},
01307 { Token::FLOAT, { TA_SHIFT_AND_PUSH_STATE, 13}},
01308 { Token::CHARACTER, { TA_SHIFT_AND_PUSH_STATE, 14}},
01309 { Token::STRING_FRAGMENT, { TA_SHIFT_AND_PUSH_STATE, 15}},
01310 { static_cast<Token::Type>('{'), { TA_SHIFT_AND_PUSH_STATE, 16}},
01311 { static_cast<Token::Type>('['), { TA_SHIFT_AND_PUSH_STATE, 17}},
01312 { static_cast<Token::Type>(']'), { TA_SHIFT_AND_PUSH_STATE, 38}},
01313
01314 { Token::structure__, { TA_PUSH_STATE, 18}},
01315 { Token::array__, { TA_PUSH_STATE, 19}},
01316 { Token::value__, { TA_PUSH_STATE, 39}},
01317 { Token::string__, { TA_PUSH_STATE, 21}},
01318
01319
01320
01321
01322
01323 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 10}},
01324
01325
01326
01327
01328
01329 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 24}},
01330
01331
01332
01333
01334
01335 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 11}},
01336
01337
01338
01339
01340
01341 { Token::DEFAULT_, { TA_REDUCE_USING_RULE, 14}}
01342
01343 };
01344
01345 unsigned int const DataFileParser::ms_state_transition_count =
01346 sizeof(DataFileParser::ms_state_transition) /
01347 sizeof(DataFileParser::StateTransition);
01348
01349
01350 #line 105 "xrb_datafileparser.trison"
01351
01352 DataFileParser::ReturnCode DataFileParser::Parse (std::string const &input_path)
01353 {
01354 ASSERT1(m_scanner != NULL);
01355 ASSERT1(!m_scanner->IsOpen());
01356
01357 if (input_path.find_first_of("|") != static_cast<std::string::size_type>(-1))
01358 return RC_INVALID_FILENAME;
01359
01360
01361 if (!m_scanner->Open(input_path))
01362 return RC_FILE_OPEN_FAILURE;
01363
01364
01365 if (Parse() == PRC_UNHANDLED_PARSE_ERROR)
01366 return RC_PARSE_ERROR;
01367
01368
01369 if (m_scanner->WereErrorsEncountered())
01370 return RC_ERRORS_ENCOUNTERED;
01371
01372
01373 return RC_SUCCESS;
01374 }
01375
01376 DataFileParser::Token::Type DataFileParser::Scan ()
01377 {
01378 ASSERT1(m_scanner != NULL);
01379 return m_scanner->Scan(&m_lookahead_token);
01380 }
01381
01382 void DataFileParser::EmitWarning (std::string const &message)
01383 {
01384 ASSERT1(m_scanner != NULL);
01385 m_scanner->EmitWarning(message);
01386 }
01387
01388 void DataFileParser::EmitWarning (DataFileLocation const &file_location, std::string const &message)
01389 {
01390 ASSERT1(m_scanner != NULL);
01391 m_scanner->EmitWarning(file_location, message);
01392 }
01393
01394 void DataFileParser::EmitError (std::string const &message)
01395 {
01396 ASSERT1(m_scanner != NULL);
01397 m_scanner->EmitError(message);
01398 }
01399
01400 void DataFileParser::EmitError (DataFileLocation const &file_location, std::string const &message)
01401 {
01402 ASSERT1(m_scanner != NULL);
01403 m_scanner->EmitError(file_location, message);
01404 }
01405
01406 }
01407
01408 #line 1409 "xrb_datafileparser.cpp"
01409