Node *PolynomialParser::ParseC(int k) { char *start = input; if (accept('(')) { auto n = ParseW(k + 1); if (n == nullptr) { input = start; return nullptr; } else { if (accept(')')) { if (accept('^')) { if (accept('[')) { auto m = ParseL(k + 1); if (accept(']')) { if (m == nullptr) { input = start; return nullptr; } else { if (accept('^')) { input = start; return nullptr; } else { n = new Node(Node::Type::POW, n, m); return n; } } } else { input = start; return nullptr; } } else { input = start; return nullptr; } } else { return n; } } else { input = start; return nullptr; } } } else { if (accept('x')) { return new Node(Node::Type::VAR); } else { if (accept('[')) { auto n = ParseL(k + 1); if (accept(']')) { if (n != nullptr) { if (accept('^')) { if (accept('[')) { auto m = ParseL(k + 1); if (accept(']')) { if (m == nullptr) { input = start; return nullptr; } else { n = new Node(Node::Type::POW, n, m); return n; } } else { input = start; return nullptr; } } else { input = start; return nullptr; } } else { return n; } } else { return nullptr; } } else { return nullptr; } } else { return nullptr; } } } }