@@ -1745,8 +1745,13 @@ static Token * createAstAtToken(Token *tok)
17451745 semicolon1->astOperand2 (state2.op .top ());
17461746 }
17471747
1748- if (init != semicolon1)
1749- semicolon1->astOperand1 (init->astTop ());
1748+ if (init != semicolon1) {
1749+ Token * top = init;
1750+ while (top->astParent ()) {
1751+ top = top->astParent ();
1752+ }
1753+ semicolon1->astOperand1 (top);
1754+ }
17501755 tok->next ()->astOperand1 (tok);
17511756 tok->next ()->astOperand2 (semicolon1);
17521757
@@ -1860,6 +1865,36 @@ void TokenList::createAst() const
18601865 throw InternalError (tok, " Syntax Error: Infinite loop when creating AST." , InternalError::AST);
18611866 tok = nextTok;
18621867 }
1868+ for (Token *tok = mTokensFrontBack ->front ; tok; tok = tok ? tok->next () : nullptr ) {
1869+ if ((tok->astOperand1 () || tok->astOperand2 ()) && (!tok->isTopSet ())) {
1870+ Token * top = tok;
1871+ while (top->astParent ()) {
1872+ top = top->astParent ();
1873+ }
1874+ std::list<Token *> current_list;
1875+ std::list<Token *> back_list;
1876+ current_list.push_back (top);
1877+
1878+ for (auto it = current_list.begin (); it != current_list.end ();) {
1879+ Token * op1 = (*it)->astOperand1 ();
1880+ Token * op2 = (*it)->astOperand2 ();
1881+ if (op1) {
1882+ back_list.push_back (op1);
1883+ op1->astTop (top);
1884+ }
1885+ if (op2) {
1886+ back_list.push_back (op2);
1887+ op2->astTop (top);
1888+ }
1889+ ++it;
1890+ if (it == current_list.end () && back_list.size () > 0 ) {
1891+ current_list = back_list;
1892+ it = current_list.begin ();
1893+ back_list.clear ();
1894+ }
1895+ }
1896+ }
1897+ }
18631898}
18641899
18651900namespace {
0 commit comments