@@ -363,15 +363,21 @@ void Pargen::Parser::generate_source(std::ostream& os){
363363 " }\n "
364364 " auto& saved = branches.top();\n "
365365 " auto buf_top = buffer.begin();\n "
366- " for(auto it = stack.begin(); it != saved; it = std::next(it)){\n "
366+ " Stack::iterator new_head = stack.begin();\n "
367+ " for(auto it = stack.begin(); (it != stack.end()) && (it != saved); it = std::next(it)){\n "
368+ " new_head = it;\n "
367369 " if(std::holds_alternative<token_t>(it->elem)){\n "
368370 " buffer.emplace(buf_top, it->term, std::get<token_t>(it->elem));\n "
369371 " }else{\n "
370372 " auto flattened = std::get<Node>(it->elem).flatten();\n "
371373 " buffer.insert(buf_top, flattened.begin(), flattened.end());\n "
372374 " }\n "
373375 " }\n "
374- " saved->branch += 1;\n "
376+ " new_head->branch += 1;\n "
377+ " new_head->term = buffer.front().first;\n "
378+ " new_head->elem = buffer.front().second;\n "
379+ " buffer.pop_front();\n "
380+ " stack.erase(stack.begin(), new_head);\n "
375381 " };\n "
376382 " // Parse\n "
377383 " while(stack.front().state != End){\n "
@@ -381,7 +387,7 @@ void Pargen::Parser::generate_source(std::ostream& os){
381387 " std::vector<Act>& acts = state[entry.term];\n "
382388 " if(entry.branch == 0){\n "
383389 " if(acts.size() > 1){\n "
384- " branches.emplace(stack.begin());\n "
390+ " branches.emplace(std::next( stack.begin() ));\n "
385391 " }\n "
386392 " }else if(entry.branch == acts.size() - 1){\n "
387393 " branches.pop();\n "
0 commit comments