int Parser::parse () { // State. int yyn; /// Length of the RHS of the rule being reduced. int yylen = 0; // Error handling. int yynerrs_ = 0; int yyerrstatus_ = 0; /// The lookahead symbol. symbol_type yyla; /// The return value of parse (). int yyresult; // FIXME: This shoud be completely indented. It is not yet to // avoid gratuitous conflicts when merging into the master branch. try { YYCDEBUG << "Starting parse" << std::endl; /* Initialize the stack. The initial state will be set in yynewstate, since the latter expects the semantical and the location values to have been already stored, initialize these stacks with a primary value. */ yystack_.clear (); yypush_ (YY_NULLPTR, 0, yyla); // A new symbol was pushed on the stack. yynewstate: YYCDEBUG << "Entering state " << yystack_[0].state << std::endl; // Accept? if (yystack_[0].state == yyfinal_) goto yyacceptlab; goto yybackup; // Backup. yybackup: // Try to take a decision without lookahead. yyn = yypact_[yystack_[0].state]; if (yy_pact_value_is_default_ (yyn)) goto yydefault; // Read a lookahead token. if (yyla.empty ()) { YYCDEBUG << "Reading a token: "; try { yyla.type = yytranslate_ (yylex (&yyla.value)); } catch (const syntax_error& yyexc) { error (yyexc); goto yyerrlab1; } } YY_SYMBOL_PRINT ("Next token is", yyla); /* If the proper action on seeing token YYLA.TYPE is to reduce or to detect an error, take that action. */ yyn += yyla.type_get (); if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type_get ()) goto yydefault; // Reduce or error. yyn = yytable_[yyn]; if (yyn <= 0) { if (yy_table_value_is_error_ (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } // Count tokens shifted since error; after three, turn off error status. if (yyerrstatus_) --yyerrstatus_; // Shift the lookahead token. yypush_ ("Shifting", yyn, yyla); goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact_[yystack_[0].state]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: yylen = yyr2_[yyn]; { stack_symbol_type yylhs; yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]); /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, use the top of the stack. Otherwise, the following line sets YYLHS.VALUE to garbage. This behavior is undocumented and Bison users should not rely upon it. */ if (yylen) yylhs.value = yystack_[yylen - 1].value; else yylhs.value = yystack_[0].value; // Perform the reduction. YY_REDUCE_PRINT (yyn); try { switch (yyn) { case 2: #line 147 "src/grammar/parser.yy" // lalr1.cc:859 { std::vector<Nodes::AbstractNode *> nodes; nodes.push_back((yystack_[0].value.abs_node)); driver.push_stack(nodes); (yylhs.value.driver) = &driver; } #line 692 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 3: #line 153 "src/grammar/parser.yy" // lalr1.cc:859 { (yystack_[2].value.driver)->push_node((yystack_[0].value.abs_node)); (yylhs.value.driver) = (yystack_[2].value.driver); } #line 701 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 4: #line 157 "src/grammar/parser.yy" // lalr1.cc:859 { } #line 709 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 5: #line 160 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.driver) = (yystack_[1].value.driver); } #line 717 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 6: #line 167 "src/grammar/parser.yy" // lalr1.cc:859 { std::vector<Nodes::AbstractNode *> nodes; nodes.push_back((yystack_[0].value.abs_node)); Nodes::Nodes *nodelist = new Nodes::Nodes(nodes); (yylhs.value.nodes) = nodelist; } #line 728 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 7: #line 173 "src/grammar/parser.yy" // lalr1.cc:859 { (yystack_[2].value.nodes)->add((yystack_[0].value.abs_node)); (yylhs.value.nodes) = (yystack_[2].value.nodes); } #line 737 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 8: #line 177 "src/grammar/parser.yy" // lalr1.cc:859 { /* do nothing */ } #line 743 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 9: #line 178 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.nodes) = (yystack_[1].value.nodes); } #line 751 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 20: #line 194 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = (yystack_[1].value.abs_node); } #line 757 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 21: #line 198 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::LiteralNode((yystack_[0].value.ival)); } #line 765 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 22: #line 201 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::LiteralNode((yystack_[0].value.fval)); } #line 773 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 23: #line 204 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::LiteralNode(*(yystack_[0].value.sval)); } #line 781 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 24: #line 207 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::SelfNode(); } #line 789 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 33: #line 212 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.sval) = (yystack_[0].value.sval); } #line 795 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 34: #line 215 "src/grammar/parser.yy" // lalr1.cc:859 { std::vector<Nodes::AbstractNode*> arguments; arguments.push_back((yystack_[0].value.abs_node)); (yylhs.value.abs_node) = new Nodes::CallNode(*(yystack_[1].value.sval), (yystack_[2].value.abs_node), arguments); } #line 805 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 35: #line 220 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::CallNode(*(yystack_[3].value.sval), NULL, *(yystack_[1].value.arguments)); } #line 811 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 36: #line 221 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::CallNode(*(yystack_[3].value.sval), (yystack_[5].value.abs_node), *(yystack_[1].value.arguments)); } #line 817 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 37: #line 227 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::MethodDefinitionNode(*(yystack_[6].value.sval), *(yystack_[4].value.parameters), (yystack_[1].value.nodes)); } #line 825 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 38: #line 233 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::MethodDefinitionNode(*(yystack_[6].value.sval), *(yystack_[4].value.parameters), (yystack_[1].value.nodes)); } #line 833 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 39: #line 242 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::LambdaNode(*(yystack_[4].value.parameters),(yystack_[1].value.nodes)); } #line 841 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 40: #line 248 "src/grammar/parser.yy" // lalr1.cc:859 { std::vector<Nodes::AbstractNode*> *arguments = new std::vector<Nodes::AbstractNode*>(); arguments->push_back((yystack_[0].value.abs_node)); (yylhs.value.arguments) = arguments; } #line 851 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 41: #line 253 "src/grammar/parser.yy" // lalr1.cc:859 { (yystack_[2].value.arguments)->push_back((yystack_[0].value.abs_node)); (yylhs.value.arguments) = (yystack_[2].value.arguments); } #line 860 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 42: #line 257 "src/grammar/parser.yy" // lalr1.cc:859 { std::vector<Nodes::AbstractNode*> *arguments = new std::vector<Nodes::AbstractNode*>(); (yylhs.value.arguments) = arguments; } #line 869 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 43: #line 264 "src/grammar/parser.yy" // lalr1.cc:859 { std::vector<std::string> *parameters = new std::vector<std::string>(); parameters->push_back(*(yystack_[0].value.sval)); (yylhs.value.parameters) = parameters; } #line 879 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 44: #line 269 "src/grammar/parser.yy" // lalr1.cc:859 { (yystack_[2].value.parameters)->push_back(*(yystack_[0].value.sval)); (yylhs.value.parameters) = (yystack_[2].value.parameters); } #line 885 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 45: #line 270 "src/grammar/parser.yy" // lalr1.cc:859 { std::vector<std::string> *parameters = new std::vector<std::string>(); (yylhs.value.parameters) = parameters; } #line 894 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 46: #line 279 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::ClassDefinitionNode(*(yystack_[5].value.sval), *(yystack_[3].value.sval), (yystack_[1].value.nodes)); } #line 902 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 47: #line 284 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::ClassDefinitionNode(*(yystack_[3].value.sval), std::string(""), (yystack_[1].value.nodes)); } #line 910 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 48: #line 292 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::IfNode((yystack_[3].value.nodes), (yystack_[1].value.nodes)); } #line 916 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 49: #line 296 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::ReturnNode((yystack_[0].value.nodes)); } #line 922 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 50: #line 300 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::LocalAssignNode(*(yystack_[2].value.sval), (yystack_[0].value.abs_node)); } #line 928 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 51: #line 304 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::LocalNode(*(yystack_[0].value.sval)); } #line 934 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 52: #line 308 "src/grammar/parser.yy" // lalr1.cc:859 { (yylhs.value.abs_node) = new Nodes::ConstantNode(*(yystack_[0].value.sval)); } #line 940 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; #line 944 "src/frontend/parser.tab.cpp" // lalr1.cc:859 default: break; } } catch (const syntax_error& yyexc) { error (yyexc); YYERROR; } YY_SYMBOL_PRINT ("-> $$ =", yylhs); yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); // Shift the result of the reduction. yypush_ (YY_NULLPTR, yylhs); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: // If not already recovering from an error, report this error. if (!yyerrstatus_) { ++yynerrs_; error (yysyntax_error_ (yystack_[0].state, yyla)); } if (yyerrstatus_ == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ // Return failure if at end of input. if (yyla.type_get () == yyeof_) YYABORT; else if (!yyla.empty ()) { yy_destroy_ ("Error: discarding", yyla); yyla.clear (); } } // Else will try to reuse lookahead token after shifting the error token. goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (false) goto yyerrorlab; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ yypop_ (yylen); yylen = 0; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus_ = 3; // Each real token shifted decrements this. { stack_symbol_type error_token; for (;;) { yyn = yypact_[yystack_[0].state]; if (!yy_pact_value_is_default_ (yyn)) { yyn += yyterror_; if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) { yyn = yytable_[yyn]; if (0 < yyn) break; } } // Pop the current state because it cannot handle the error token. if (yystack_.size () == 1) YYABORT; yy_destroy_ ("Error: popping", yystack_[0]); yypop_ (); YY_STACK_PRINT (); } // Shift the error token. error_token.state = yyn; yypush_ ("Shifting", error_token); } goto yynewstate; // Accept. yyacceptlab: yyresult = 0; goto yyreturn; // Abort. yyabortlab: yyresult = 1; goto yyreturn; yyreturn: if (!yyla.empty ()) yy_destroy_ ("Cleanup: discarding lookahead", yyla); /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ yypop_ (yylen); while (1 < yystack_.size ()) { yy_destroy_ ("Cleanup: popping", yystack_[0]); yypop_ (); } return yyresult; } catch (...) { YYCDEBUG << "Exception caught: cleaning lookahead and stack" << std::endl; // Do not try to display the values of the reclaimed symbols, // as their printer might throw an exception. if (!yyla.empty ()) yy_destroy_ (YY_NULLPTR, yyla); while (1 < yystack_.size ()) { yy_destroy_ (YY_NULLPTR, yystack_[0]); yypop_ (); } throw; } }
int Parser::parse () { /// Whether yyla contains a lookahead. bool yyempty = true; // State. int yyn; /// Length of the RHS of the rule being reduced. int yylen = 0; // Error handling. int yynerrs_ = 0; int yyerrstatus_ = 0; /// The lookahead symbol. symbol_type yyla; /// The locations where the error started and ended. stack_symbol_type yyerror_range[3]; /// The return value of parse (). int yyresult; // FIXME: This shoud be completely indented. It is not yet to // avoid gratuitous conflicts when merging into the master branch. try { YYCDEBUG << "Starting parse" << std::endl; // User initialization code. #line 36 "parser.yy" // lalr1.cc:725 { // initialize the initial location object yyla.location.begin.filename = yyla.location.end.filename = &driver.streamname; } #line 501 "parser.cpp" // lalr1.cc:725 /* Initialize the stack. The initial state will be set in yynewstate, since the latter expects the semantical and the location values to have been already stored, initialize these stacks with a primary value. */ yystack_.clear (); yypush_ (YY_NULLPTR, 0, yyla); // A new symbol was pushed on the stack. yynewstate: YYCDEBUG << "Entering state " << yystack_[0].state << std::endl; // Accept? if (yystack_[0].state == yyfinal_) goto yyacceptlab; goto yybackup; // Backup. yybackup: // Try to take a decision without lookahead. yyn = yypact_[yystack_[0].state]; if (yy_pact_value_is_default_ (yyn)) goto yydefault; // Read a lookahead token. if (yyempty) { YYCDEBUG << "Reading a token: "; try { yyla.type = yytranslate_ (yylex (&yyla.value, &yyla.location)); } catch (const syntax_error& yyexc) { error (yyexc); goto yyerrlab1; } yyempty = false; } YY_SYMBOL_PRINT ("Next token is", yyla); /* If the proper action on seeing token YYLA.TYPE is to reduce or to detect an error, take that action. */ yyn += yyla.type_get (); if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type_get ()) goto yydefault; // Reduce or error. yyn = yytable_[yyn]; if (yyn <= 0) { if (yy_table_value_is_error_ (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } // Discard the token being shifted. yyempty = true; // Count tokens shifted since error; after three, turn off error status. if (yyerrstatus_) --yyerrstatus_; // Shift the lookahead token. yypush_ ("Shifting", yyn, yyla); goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact_[yystack_[0].state]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: yylen = yyr2_[yyn]; { stack_symbol_type yylhs; yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]); /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, use the top of the stack. Otherwise, the following line sets YYLHS.VALUE to garbage. This behavior is undocumented and Bison users should not rely upon it. */ if (yylen) yylhs.value = yystack_[yylen - 1].value; else yylhs.value = yystack_[0].value; // Compute the default @$. { slice<stack_symbol_type, stack_type> slice (yystack_, yylen); YYLLOC_DEFAULT (yylhs.location, slice, yylen); } // Perform the reduction. YY_REDUCE_PRINT (yyn); try { switch (yyn) { case 2: #line 88 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = new query_true(); } #line 617 "parser.cpp" // lalr1.cc:847 break; case 3: #line 92 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = new query_true(); } #line 625 "parser.cpp" // lalr1.cc:847 break; case 4: #line 97 "parser.yy" // lalr1.cc:847 { (yylhs.value.stringVal) = (yystack_[0].value.stringVal); } #line 633 "parser.cpp" // lalr1.cc:847 break; case 5: #line 102 "parser.yy" // lalr1.cc:847 { (yylhs.value.stringVal) = (yystack_[0].value.stringVal); } #line 641 "parser.cpp" // lalr1.cc:847 break; case 6: #line 106 "parser.yy" // lalr1.cc:847 { (yylhs.value.stringVal) = (yystack_[0].value.stringVal); } #line 649 "parser.cpp" // lalr1.cc:847 break; case 7: #line 110 "parser.yy" // lalr1.cc:847 { (yylhs.value.stringVal) = (yystack_[0].value.stringVal); } #line 657 "parser.cpp" // lalr1.cc:847 break; case 8: #line 114 "parser.yy" // lalr1.cc:847 { (yylhs.value.stringVal) = (yystack_[0].value.stringVal); } #line 665 "parser.cpp" // lalr1.cc:847 break; case 9: #line 118 "parser.yy" // lalr1.cc:847 { (yylhs.value.stringVal) = (yystack_[0].value.stringVal); } #line 673 "parser.cpp" // lalr1.cc:847 break; case 10: #line 123 "parser.yy" // lalr1.cc:847 { delete (yystack_[1].value.stringVal); (yylhs.value.querynode) = new query_tagged((yystack_[0].value.stringVal)); } #line 682 "parser.cpp" // lalr1.cc:847 break; case 11: #line 128 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = new query_tagged((yystack_[0].value.stringVal)); } #line 690 "parser.cpp" // lalr1.cc:847 break; case 12: #line 132 "parser.yy" // lalr1.cc:847 { delete (yystack_[1].value.stringVal); (yylhs.value.querynode) = new query_field((yystack_[2].value.unquotedstringVal)); } #line 699 "parser.cpp" // lalr1.cc:847 break; case 13: #line 138 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = new query_field((yystack_[2].value.unquotedstringVal), (yystack_[0].value.stringVal), (yystack_[1].value.stringVal)); } #line 707 "parser.cpp" // lalr1.cc:847 break; case 14: #line 142 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = new query_field((yystack_[2].value.unquotedstringVal), (yystack_[0].value.integerVal), (yystack_[1].value.stringVal)); } #line 715 "parser.cpp" // lalr1.cc:847 break; case 15: #line 146 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = new query_field((yystack_[2].value.unquotedstringVal), (yystack_[0].value.doubleVal), (yystack_[1].value.stringVal)); } #line 723 "parser.cpp" // lalr1.cc:847 break; case 16: #line 151 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = (yystack_[1].value.querynode); } #line 731 "parser.cpp" // lalr1.cc:847 break; case 17: #line 155 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = new query_and((yystack_[2].value.querynode), (yystack_[0].value.querynode)); } #line 739 "parser.cpp" // lalr1.cc:847 break; case 18: #line 159 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = new query_or((yystack_[2].value.querynode), (yystack_[0].value.querynode)); } #line 747 "parser.cpp" // lalr1.cc:847 break; case 19: #line 163 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = new query_not((yystack_[0].value.querynode)); } #line 755 "parser.cpp" // lalr1.cc:847 break; case 20: #line 167 "parser.yy" // lalr1.cc:847 { (yylhs.value.querynode) = (yystack_[0].value.querynode); } #line 763 "parser.cpp" // lalr1.cc:847 break; case 21: #line 172 "parser.yy" // lalr1.cc:847 { driver.query.set_expression((yystack_[0].value.querynode)); } #line 771 "parser.cpp" // lalr1.cc:847 break; case 22: #line 176 "parser.yy" // lalr1.cc:847 { driver.query.set_expression((yystack_[0].value.querynode)); } #line 779 "parser.cpp" // lalr1.cc:847 break; #line 783 "parser.cpp" // lalr1.cc:847 default: break; } } catch (const syntax_error& yyexc) { error (yyexc); YYERROR; } YY_SYMBOL_PRINT ("-> $$ =", yylhs); yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); // Shift the result of the reduction. yypush_ (YY_NULLPTR, yylhs); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: // If not already recovering from an error, report this error. if (!yyerrstatus_) { ++yynerrs_; error (yyla.location, yysyntax_error_ (yystack_[0].state, yyempty ? yyempty_ : yyla.type_get ())); } yyerror_range[1].location = yyla.location; if (yyerrstatus_ == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ // Return failure if at end of input. if (yyla.type_get () == yyeof_) YYABORT; else if (!yyempty) { yy_destroy_ ("Error: discarding", yyla); yyempty = true; } } // Else will try to reuse lookahead token after shifting the error token. goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (false) goto yyerrorlab; yyerror_range[1].location = yystack_[yylen - 1].location; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ yypop_ (yylen); yylen = 0; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus_ = 3; // Each real token shifted decrements this. { stack_symbol_type error_token; for (;;) { yyn = yypact_[yystack_[0].state]; if (!yy_pact_value_is_default_ (yyn)) { yyn += yyterror_; if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) { yyn = yytable_[yyn]; if (0 < yyn) break; } } // Pop the current state because it cannot handle the error token. if (yystack_.size () == 1) YYABORT; yyerror_range[1].location = yystack_[0].location; yy_destroy_ ("Error: popping", yystack_[0]); yypop_ (); YY_STACK_PRINT (); } yyerror_range[2].location = yyla.location; YYLLOC_DEFAULT (error_token.location, yyerror_range, 2); // Shift the error token. error_token.state = yyn; yypush_ ("Shifting", error_token); } goto yynewstate; // Accept. yyacceptlab: yyresult = 0; goto yyreturn; // Abort. yyabortlab: yyresult = 1; goto yyreturn; yyreturn: if (!yyempty) yy_destroy_ ("Cleanup: discarding lookahead", yyla); /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ yypop_ (yylen); while (1 < yystack_.size ()) { yy_destroy_ ("Cleanup: popping", yystack_[0]); yypop_ (); } return yyresult; } catch (...) { YYCDEBUG << "Exception caught: cleaning lookahead and stack" << std::endl; // Do not try to display the values of the reclaimed symbols, // as their printer might throw an exception. if (!yyempty) yy_destroy_ (YY_NULLPTR, yyla); while (1 < yystack_.size ()) { yy_destroy_ (YY_NULLPTR, yystack_[0]); yypop_ (); } throw; } }
int Parser::parse () { // State. int yyn; /// Length of the RHS of the rule being reduced. int yylen = 0; // Error handling. int yynerrs_ = 0; int yyerrstatus_ = 0; /// The lookahead symbol. symbol_type yyla; /// The return value of parse (). int yyresult; // FIXME: This shoud be completely indented. It is not yet to // avoid gratuitous conflicts when merging into the master branch. try { YYCDEBUG << "Starting parse" << std::endl; /* Initialize the stack. The initial state will be set in yynewstate, since the latter expects the semantical and the location values to have been already stored, initialize these stacks with a primary value. */ yystack_.clear (); yypush_ (YY_NULLPTR, 0, yyla); // A new symbol was pushed on the stack. yynewstate: YYCDEBUG << "Entering state " << yystack_[0].state << std::endl; // Accept? if (yystack_[0].state == yyfinal_) goto yyacceptlab; goto yybackup; // Backup. yybackup: // Try to take a decision without lookahead. yyn = yypact_[yystack_[0].state]; if (yy_pact_value_is_default_ (yyn)) goto yydefault; // Read a lookahead token. if (yyla.empty ()) { YYCDEBUG << "Reading a token: "; try { yyla.type = yytranslate_ (yylex (&yyla.value)); } catch (const syntax_error& yyexc) { error (yyexc); goto yyerrlab1; } } YY_SYMBOL_PRINT ("Next token is", yyla); /* If the proper action on seeing token YYLA.TYPE is to reduce or to detect an error, take that action. */ yyn += yyla.type_get (); if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type_get ()) goto yydefault; // Reduce or error. yyn = yytable_[yyn]; if (yyn <= 0) { if (yy_table_value_is_error_ (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } // Count tokens shifted since error; after three, turn off error status. if (yyerrstatus_) --yyerrstatus_; // Shift the lookahead token. yypush_ ("Shifting", yyn, yyla); goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact_[yystack_[0].state]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: yylen = yyr2_[yyn]; { stack_symbol_type yylhs; yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]); /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, use the top of the stack. Otherwise, the following line sets YYLHS.VALUE to garbage. This behavior is undocumented and Bison users should not rely upon it. */ if (yylen) yylhs.value = yystack_[yylen - 1].value; else yylhs.value = yystack_[0].value; // Perform the reduction. YY_REDUCE_PRINT (yyn); try { switch (yyn) { case 4: #line 55 "src/grammar/parser.yy" // lalr1.cc:859 { driver.add_upper(); } #line 572 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 5: #line 56 "src/grammar/parser.yy" // lalr1.cc:859 { driver.add_lower(); } #line 578 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 6: #line 57 "src/grammar/parser.yy" // lalr1.cc:859 { driver.add_word( *(yystack_[0].value.sval) ); } #line 584 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 7: #line 58 "src/grammar/parser.yy" // lalr1.cc:859 { driver.add_newline(); } #line 590 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; case 8: #line 59 "src/grammar/parser.yy" // lalr1.cc:859 { driver.add_char(); } #line 596 "src/frontend/parser.tab.cpp" // lalr1.cc:859 break; #line 600 "src/frontend/parser.tab.cpp" // lalr1.cc:859 default: break; } } catch (const syntax_error& yyexc) { error (yyexc); YYERROR; } YY_SYMBOL_PRINT ("-> $$ =", yylhs); yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); // Shift the result of the reduction. yypush_ (YY_NULLPTR, yylhs); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: // If not already recovering from an error, report this error. if (!yyerrstatus_) { ++yynerrs_; error (yysyntax_error_ (yystack_[0].state, yyla)); } if (yyerrstatus_ == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ // Return failure if at end of input. if (yyla.type_get () == yyeof_) YYABORT; else if (!yyla.empty ()) { yy_destroy_ ("Error: discarding", yyla); yyla.clear (); } } // Else will try to reuse lookahead token after shifting the error token. goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (false) goto yyerrorlab; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ yypop_ (yylen); yylen = 0; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus_ = 3; // Each real token shifted decrements this. { stack_symbol_type error_token; for (;;) { yyn = yypact_[yystack_[0].state]; if (!yy_pact_value_is_default_ (yyn)) { yyn += yyterror_; if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) { yyn = yytable_[yyn]; if (0 < yyn) break; } } // Pop the current state because it cannot handle the error token. if (yystack_.size () == 1) YYABORT; yy_destroy_ ("Error: popping", yystack_[0]); yypop_ (); YY_STACK_PRINT (); } // Shift the error token. error_token.state = yyn; yypush_ ("Shifting", error_token); } goto yynewstate; // Accept. yyacceptlab: yyresult = 0; goto yyreturn; // Abort. yyabortlab: yyresult = 1; goto yyreturn; yyreturn: if (!yyla.empty ()) yy_destroy_ ("Cleanup: discarding lookahead", yyla); /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ yypop_ (yylen); while (1 < yystack_.size ()) { yy_destroy_ ("Cleanup: popping", yystack_[0]); yypop_ (); } return yyresult; } catch (...) { YYCDEBUG << "Exception caught: cleaning lookahead and stack" << std::endl; // Do not try to display the values of the reclaimed symbols, // as their printer might throw an exception. if (!yyla.empty ()) yy_destroy_ (YY_NULLPTR, yyla); while (1 < yystack_.size ()) { yy_destroy_ (YY_NULLPTR, yystack_[0]); yypop_ (); } throw; } }
int xml_parser::parse () { // State. int yyn; /// Length of the RHS of the rule being reduced. int yylen = 0; // Error handling. int yynerrs_ = 0; int yyerrstatus_ = 0; /// The lookahead symbol. symbol_type yyla; /// The locations where the error started and ended. stack_symbol_type yyerror_range[3]; /// The return value of parse (). int yyresult; // FIXME: This shoud be completely indented. It is not yet to // avoid gratuitous conflicts when merging into the master branch. try { YYCDEBUG << "Starting parse" << std::endl; /* Initialize the stack. The initial state will be set in yynewstate, since the latter expects the semantical and the location values to have been already stored, initialize these stacks with a primary value. */ yystack_.clear (); yypush_ (YY_NULLPTR, 0, yyla); // A new symbol was pushed on the stack. yynewstate: YYCDEBUG << "Entering state " << yystack_[0].state << std::endl; // Accept? if (yystack_[0].state == yyfinal_) goto yyacceptlab; goto yybackup; // Backup. yybackup: // Try to take a decision without lookahead. yyn = yypact_[yystack_[0].state]; if (yy_pact_value_is_default_ (yyn)) goto yydefault; // Read a lookahead token. if (yyla.empty ()) { YYCDEBUG << "Reading a token: "; try { symbol_type yylookahead (yylex ()); yyla.move (yylookahead); } catch (const syntax_error& yyexc) { error (yyexc); goto yyerrlab1; } } YY_SYMBOL_PRINT ("Next token is", yyla); /* If the proper action on seeing token YYLA.TYPE is to reduce or to detect an error, take that action. */ yyn += yyla.type_get (); if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type_get ()) goto yydefault; // Reduce or error. yyn = yytable_[yyn]; if (yyn <= 0) { if (yy_table_value_is_error_ (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } // Count tokens shifted since error; after three, turn off error status. if (yyerrstatus_) --yyerrstatus_; // Shift the lookahead token. yypush_ ("Shifting", yyn, yyla); goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact_[yystack_[0].state]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: yylen = yyr2_[yyn]; { stack_symbol_type yylhs; yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]); /* Variants are always initialized to an empty instance of the correct type. The default '$$ = $1' action is NOT applied when using variants. */ switch (yyr1_[yyn]) { case 3: // NAME case 4: // TEXT case 5: // STRING yylhs.value.build< std::string > (); break; default: break; } // Compute the default @$. { slice<stack_symbol_type, stack_type> slice (yystack_, yylen); YYLLOC_DEFAULT (yylhs.location, slice, yylen); } // Perform the reduction. YY_REDUCE_PRINT (yyn); try { switch (yyn) { case 2: #line 38 "xml_parser/parser.ypp" // lalr1.cc:859 { result = "OK"; } #line 541 "xml_parser/parser.cpp" // lalr1.cc:859 break; case 6: if (! (//#line 46 "xml_parser/parser.ypp" // lalr1.cc:859 yystack_[5].value.as< std::string > () == yystack_[0].value.as< std::string > () )) YYERROR; #line 547 "xml_parser/parser.cpp" // lalr1.cc:859 break; #line 551 "xml_parser/parser.cpp" // lalr1.cc:859 default: break; } } catch (const syntax_error& yyexc) { error (yyexc); YYERROR; } YY_SYMBOL_PRINT ("-> $$ =", yylhs); yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); // Shift the result of the reduction. yypush_ (YY_NULLPTR, yylhs); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: // If not already recovering from an error, report this error. if (!yyerrstatus_) { ++yynerrs_; error (yyla.location, yysyntax_error_ (yystack_[0].state, yyla)); } yyerror_range[1].location = yyla.location; if (yyerrstatus_ == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ // Return failure if at end of input. if (yyla.type_get () == yyeof_) YYABORT; else if (!yyla.empty ()) { yy_destroy_ ("Error: discarding", yyla); yyla.clear (); } } // Else will try to reuse lookahead token after shifting the error token. goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (false) goto yyerrorlab; yyerror_range[1].location = yystack_[yylen - 1].location; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ yypop_ (yylen); yylen = 0; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus_ = 3; // Each real token shifted decrements this. { stack_symbol_type error_token; for (;;) { yyn = yypact_[yystack_[0].state]; if (!yy_pact_value_is_default_ (yyn)) { yyn += yyterror_; if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) { yyn = yytable_[yyn]; if (0 < yyn) break; } } // Pop the current state because it cannot handle the error token. if (yystack_.size () == 1) YYABORT; yyerror_range[1].location = yystack_[0].location; yy_destroy_ ("Error: popping", yystack_[0]); yypop_ (); YY_STACK_PRINT (); } yyerror_range[2].location = yyla.location; YYLLOC_DEFAULT (error_token.location, yyerror_range, 2); // Shift the error token. error_token.state = yyn; yypush_ ("Shifting", error_token); } goto yynewstate; // Accept. yyacceptlab: yyresult = 0; goto yyreturn; // Abort. yyabortlab: yyresult = 1; goto yyreturn; yyreturn: if (!yyla.empty ()) yy_destroy_ ("Cleanup: discarding lookahead", yyla); /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ yypop_ (yylen); while (1 < yystack_.size ()) { yy_destroy_ ("Cleanup: popping", yystack_[0]); yypop_ (); } return yyresult; } catch (...) { YYCDEBUG << "Exception caught: cleaning lookahead and stack" << std::endl; // Do not try to display the values of the reclaimed symbols, // as their printer might throw an exception. if (!yyla.empty ()) yy_destroy_ (YY_NULLPTR, yyla); while (1 < yystack_.size ()) { yy_destroy_ (YY_NULLPTR, yystack_[0]); yypop_ (); } throw; } }