/* Ousía Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** * @file VariantReader.hpp * * Provides parsers for various micro formats. These formats include integers, * doubles, strings, JSON and the Ousía struct notation. * * @author Andreas Stöckel (astoecke@techfak.uni-bielefeld.de) */ #ifndef _OUSIA_VARIANT_READER_HPP_ #define _OUSIA_VARIANT_READER_HPP_ #include #include #include #include "CharReader.hpp" #include "Logger.hpp" #include "Variant.hpp" namespace ousia { class VariantReader { private: /** * Parses a string which may either be enclosed by " or ', unescapes * entities in the string as specified for JavaScript. * * @param VariantReader is a reference to the CharReader instance which is * the source for the character data. The VariantReader will be positioned * after the terminating quote character or at the terminating delimiting * character. * @param logger is the logger instance that should be used to log error * messages and warnings. * @param delims is an optional set of delimiters after which parsing has to * be stopped (the delimiters may occur inside the actual string, but not * outside). If nullptr is given, no delimiter is used and a complete string * is read. */ static std::pair parseString( CharReader &VariantReader, Logger &logger, const std::unordered_set *delims); public: /** * Parses a string which may either be enclosed by " or ', unescapes * entities in the string as specified for JavaScript. * * @param VariantReader is a reference to the CharReader instance which is * the source for the character data. The VariantReader will be positioned * after the terminating quote character or at the terminating delimiting * character. * @param logger is the logger instance that should be used to log error * messages and warnings. * @param delims is a set of delimiters after which parsing has to * be stopped (the delimiters may occur inside the actual string, but not * outside). */ static std::pair parseString( CharReader &VariantReader, Logger &logger, const std::unordered_set &delims) { return parseString(VariantReader, logger, &delims); } /** * Parses a string which may either be enclosed by " or ', unescapes * entities in the string as specified for JavaScript. * * @param VariantReader is a reference to the CharReader instance which is * the source for the character data. The VariantReader will be positioned * after the terminating quote character or at the terminating delimiting * character. * @param logger is the logger instance that should be used to log error * messages and warnings. */ static std::pair parseString(CharReader &VariantReader, Logger &logger) { return parseString(VariantReader, logger, nullptr); } /** * Extracts an unescaped string from the given buffered char VariantReader * instance. This function just reads text until one of the given delimiter * characters is reached. * * @param VariantReader is a reference to the CharReader instance which is * the source for the character data. The VariantReader will be positioned * at the terminating delimiting character. * @param delims is a set of characters which will terminate the string. * These characters are not included in the result. May not be nullptr. */ static std::pair parseUnescapedString( CharReader &VariantReader, Logger &logger, const std::unordered_set &delims); /** * Parses an integer from the given buffered char VariantReader instance * until one of the given delimiter characters is reached. * * @param VariantReader is a reference to the CharReader instance from * which the character data should been VariantReader. The VariantReader * will be positioned at the terminating delimiting character or directly * after the integer. */ static std::pair parseInteger( CharReader &VariantReader, Logger &logger, const std::unordered_set &delims); /** * Parses an double from the given buffered char VariantReader instance * until one of the given delimiter characters is reached. * * @param VariantReader is a reference to the CharReader instance from * which the character data should been VariantReader. The VariantReader * will be positioned at the terminating delimiting character or directly * after the integer. */ static std::pair parseDouble( CharReader &VariantReader, Logger &logger, const std::unordered_set &delims); /** * Parses an array of values. */ static std::pair parseArray( CharReader &VariantReader, Logger &logger, char delim = 0); /** * Tries to parse the most specific item from the given stream until one of * the given delimiters is reached or a meaningful literal has been read. * The resulting variant represents the value that has been read. * * @param VariantReader is a reference to the CharReader instance which is * the source for the character data. The VariantReader will be positioned * at the terminating delimiting character. * @param delims is a set of characters which will terminate the string. * These characters are not included in the result. May not be nullptr. */ static std::pair parseGeneric( CharReader &VariantReader, Logger &logger, const std::unordered_set &delims); }; } #endif /* _OUSIA_VARIANT_READER_HPP_ */