add missing generic_json_grammar_x3
This commit is contained in:
parent
7d77835080
commit
3d629bf76d
2 changed files with 215 additions and 0 deletions
82
include/mapnik/json/generic_json_grammar_x3.hpp
Normal file
82
include/mapnik/json/generic_json_grammar_x3.hpp
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
*
|
||||||
|
* This file is part of Mapnik (c++ mapping toolkit)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2015 Artem Pavlenko
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef MAPNIK_JSON_GENERIC_JSON_GRAMMAR_X3_HPP
|
||||||
|
#define MAPNIK_JSON_GENERIC_JSON_GRAMMAR_X3_HPP
|
||||||
|
|
||||||
|
#include <mapnik/value/types.hpp>
|
||||||
|
#include <mapnik/util/variant.hpp>
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#include <mapnik/warning_ignore.hpp>
|
||||||
|
#include <boost/spirit/home/x3.hpp>
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace mapnik { namespace json {
|
||||||
|
|
||||||
|
namespace x3 = boost::spirit::x3;
|
||||||
|
|
||||||
|
struct json_value;
|
||||||
|
|
||||||
|
using json_array = std::vector<json_value>;
|
||||||
|
using json_object_element = std::pair<std::string, json_value>;
|
||||||
|
using json_object = std::vector<json_object_element>;
|
||||||
|
using json_value_base = mapnik::util::variant<value_null,
|
||||||
|
value_bool,
|
||||||
|
value_integer,
|
||||||
|
value_double,
|
||||||
|
std::string,
|
||||||
|
json_array,
|
||||||
|
json_object>;
|
||||||
|
struct json_value : json_value_base
|
||||||
|
{
|
||||||
|
#if __cpp_inheriting_constructors >= 200802
|
||||||
|
|
||||||
|
using json_value_base::json_value_base;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
json_value() = default;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
json_value(T && val)
|
||||||
|
: json_value_base(std::forward<T>(val)) {}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace grammar {
|
||||||
|
|
||||||
|
using generic_json_grammar_type = x3::rule<class generic_json_tag, json_value>;
|
||||||
|
using generic_json_key_value_type = x3::rule<class json_object_element_tag, json_object_element>;
|
||||||
|
BOOST_SPIRIT_DECLARE(generic_json_grammar_type);
|
||||||
|
BOOST_SPIRIT_DECLARE(generic_json_key_value_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
grammar::generic_json_grammar_type const& generic_json_grammar();
|
||||||
|
grammar::generic_json_key_value_type const& generic_json_key_value();
|
||||||
|
|
||||||
|
}}
|
||||||
|
|
||||||
|
#endif // MAPNIK_JSON_GENERIC_JSON_GRAMMAR_X3_HPP
|
133
include/mapnik/json/generic_json_grammar_x3_def.hpp
Normal file
133
include/mapnik/json/generic_json_grammar_x3_def.hpp
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
*
|
||||||
|
* This file is part of Mapnik (c++ mapping toolkit)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Artem Pavlenko
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef MAPNIK_JSON_GENERIC_JSON_GRAMMAR_X3_DEF_HPP
|
||||||
|
#define MAPNIK_JSON_GENERIC_JSON_GRAMMAR_X3_DEF_HPP
|
||||||
|
|
||||||
|
#include <boost/fusion/include/std_pair.hpp>
|
||||||
|
#include <mapnik/json/generic_json_grammar_x3.hpp>
|
||||||
|
#include <mapnik/json/unicode_string_grammar_x3_def.hpp>
|
||||||
|
|
||||||
|
namespace mapnik { namespace json { namespace grammar {
|
||||||
|
|
||||||
|
namespace x3 = boost::spirit::x3;
|
||||||
|
|
||||||
|
auto make_null = [] (auto const& ctx)
|
||||||
|
{
|
||||||
|
_val(ctx) = mapnik::value_null{};
|
||||||
|
};
|
||||||
|
|
||||||
|
auto make_true = [] (auto const& ctx)
|
||||||
|
{
|
||||||
|
_val(ctx) = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto make_false = [] (auto const& ctx)
|
||||||
|
{
|
||||||
|
_val(ctx) = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto assign = [](auto const& ctx)
|
||||||
|
{
|
||||||
|
_val(ctx) = _attr(ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto assign_key = [](auto const& ctx)
|
||||||
|
{
|
||||||
|
std::get<0>(_val(ctx)) = _attr(ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto assign_value = [](auto const& ctx)
|
||||||
|
{
|
||||||
|
std::get<1>(_val(ctx)) = _attr(ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
using x3::lit;
|
||||||
|
using x3::string;
|
||||||
|
// exported rules
|
||||||
|
// start
|
||||||
|
generic_json_grammar_type const value("JSON Value");
|
||||||
|
generic_json_key_value_type const key_value("JSON Object element");
|
||||||
|
// rules
|
||||||
|
x3::rule<class json_object_tag, json_object> object("JSON Object");
|
||||||
|
x3::rule<class json_array_tag, json_array> array("JSON Array");
|
||||||
|
x3::rule<class json_number_tag, json_value> number("JSON Number");
|
||||||
|
|
||||||
|
auto const json_double = x3::real_parser<value_double, x3::strict_real_policies<value_double>>();
|
||||||
|
auto const json_integer = x3::int_parser<value_integer, 10, 1, -1>();
|
||||||
|
|
||||||
|
// import unicode string rule
|
||||||
|
namespace { auto const& json_string = mapnik::json::unicode_string_grammar(); }
|
||||||
|
// generic json types
|
||||||
|
auto const value_def = object | array | json_string | number
|
||||||
|
;
|
||||||
|
|
||||||
|
auto const key_value_def = json_string[assign_key] > lit(':') > value[assign_value]
|
||||||
|
;
|
||||||
|
|
||||||
|
auto const object_def = lit('{')
|
||||||
|
> -(key_value % lit(','))
|
||||||
|
> lit('}')
|
||||||
|
;
|
||||||
|
|
||||||
|
auto const array_def = lit('[')
|
||||||
|
> -(value % lit(','))
|
||||||
|
> lit(']')
|
||||||
|
;
|
||||||
|
|
||||||
|
auto const number_def = json_double[assign]
|
||||||
|
| json_integer[assign]
|
||||||
|
| lit("true") [make_true]
|
||||||
|
| lit ("false") [make_false]
|
||||||
|
| lit("null")[make_null]
|
||||||
|
;
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#include <mapnik/warning_ignore.hpp>
|
||||||
|
|
||||||
|
BOOST_SPIRIT_DEFINE(
|
||||||
|
value,
|
||||||
|
object,
|
||||||
|
key_value,
|
||||||
|
array,
|
||||||
|
number
|
||||||
|
);
|
||||||
|
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
}}}
|
||||||
|
|
||||||
|
namespace mapnik { namespace json {
|
||||||
|
|
||||||
|
grammar::generic_json_grammar_type const& generic_json_grammar()
|
||||||
|
{
|
||||||
|
return grammar::value;
|
||||||
|
}
|
||||||
|
grammar::generic_json_key_value_type const& generic_json_key_value()
|
||||||
|
{
|
||||||
|
return grammar::key_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}}
|
||||||
|
|
||||||
|
#endif // MAPNIK_JSON_GENERIC_JSON_GRAMMAR_X3_DEF_HPP
|
Loading…
Reference in a new issue