#pragma once #include namespace DB { /** Base class for most parsers */ class IParserBase : public IParser { public: template static bool wrapParseImpl(Pos & pos, const F & func) { Pos begin = pos; bool res = func(); if (!res) pos = begin; return res; } struct IncreaseDepthTag {}; template static bool wrapParseImpl(Pos & pos, IncreaseDepthTag, const F & func) { Pos begin = pos; pos.increaseDepth(); bool res = func(); pos.decreaseDepth(); if (!res) pos = begin; return res; } bool parse(Pos & pos, ASTPtr & node, Expected & expected) override; protected: virtual bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) = 0; }; }