Skip to content

Commit c08b74e

Browse files
committed
[parser] Fix the branch restore mechanism of parse()
1 parent 926e10e commit c08b74e

1 file changed

Lines changed: 9 additions & 3 deletions

File tree

src/lib/parser/parser.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)