| 1895 | } |
| 1896 | |
| 1897 | void TokenList::createAst() const |
| 1898 | { |
| 1899 | for (Token *tok = mTokensFrontBack->front; tok; tok = tok ? tok->next() : nullptr) { |
| 1900 | Token* const nextTok = createAstAtToken(tok); |
| 1901 | if (precedes(nextTok, tok)) |
| 1902 | throw InternalError(tok, "Syntax Error: Infinite loop when creating AST.", InternalError::AST); |
| 1903 | tok = nextTok; |
| 1904 | } |
| 1905 | for (Token *tok = mTokensFrontBack->front; tok; tok = tok ? tok->next() : nullptr) { |
| 1906 | if (tok->astParent()) |
| 1907 | continue; |
| 1908 | if (!tok->astOperand1() && !tok->astOperand2()) |
| 1909 | continue; |
| 1910 | visitAstNodes(tok, [&](Token* child) { |
| 1911 | child->astTop(tok); |
| 1912 | return ChildrenToVisit::op1_and_op2; |
| 1913 | }); |
| 1914 | } |
| 1915 | } |
| 1916 | |
| 1917 | namespace { |
| 1918 | struct OnException { |