#pragma once #include #include #include #include #include namespace NProtoAST { static const char* INVALID_TOKEN_NAME = "nothing"; static const char* ABSENCE = " absence"; template void InvalidCharacter(IOutputStream& err, const InputType* input) { wchar32 rune = 0; size_t runeLen = 0; auto begin = input->get_nextChar(); auto end = begin + input->get_sizeBuf(); if (begin != end && SafeReadUTF8Char(rune, runeLen, begin, end) == RECODE_OK) { err << " '" << TStringBuf((const char*)begin, runeLen) << "' (Unicode character <" << ui32(rune) << ">)"; } } template inline void InvalidToken(IOutputStream& err, const TokenType* token) { if (token) { if (token->get_input()) { err << " '" << token->getText() << "'"; } else { err << ABSENCE; } } } class TTooManyErrors : public yexception { }; class IErrorCollector { public: explicit IErrorCollector(size_t maxErrors); virtual ~IErrorCollector(); // throws TTooManyErrors void Error(ui32 line, ui32 col, const TString& message); private: virtual void AddError(ui32 line, ui32 col, const TString& message) = 0; protected: const size_t MaxErrors; size_t NumErrors; }; class TErrorOutput: public IErrorCollector { public: TErrorOutput(IOutputStream& err, const TString& name, size_t maxErrors); virtual ~TErrorOutput(); private: void AddError(ui32 line, ui32 col, const TString& message) override; public: IOutputStream& Err; TString Name; }; } // namespace NProtoAST