#pragma once #include #include #include #include class CLuaPreProcessor { public: void ProcessText(const std::wstring& str); void Dump(const std::wstring& outName); bool IsDirectivePresent(const std::wstring& name); std::wstring GetDirectiveValue(const std::wstring& name); bool IsDirectivePresent(const std::string& name); std::wstring GetDirectiveValue(const std::string& name); std::wstring CodeString; private: struct DirectiveResult { std::map directives; std::vector> directiveRanges; }; struct OperatorPattern { std::wstring symbol; std::wstring replacementOp; }; std::vector> FindProtectedRanges(const std::wstring& str); void FindSkipRanges(); DirectiveResult FindDirectives(const std::wstring& str); std::wstring ApplyCustomOperators(const std::wstring& source); std::wstring GetIdentifierBackwards(const std::wstring& text, size_t pos); std::wstring GetIdentifierForward(const std::wstring& text, size_t pos); std::pair FindLeftExpression(const std::wstring& text, size_t operPos); std::pair FindRightExpression(const std::wstring& text, size_t startPos); bool IsInProtectedRange(size_t pos); bool IsInProtectedRange(size_t rangeStart, size_t rangeEnd); bool IsInSkipRange(size_t pos); bool IsInSkipRange(size_t rangeStart, size_t rangeEnd); std::wstring DeleteDirectives(); void UpdateInternalRanges(); void UpdateInternalDirectives(); std::vector> Ranges; std::vector> SkipRanges; DirectiveResult Directives; };