【发布时间】:2015-08-11 22:29:41
【问题描述】:
我有一个递归语法,想从它的不同规则开始解析。是否可以不用多次重写同一个语法?
示例:我有 json 解析器:
template <typename It, typename Skipper = qi::space_type>
struct grammar : qi::grammar<It, value (), Skipper>
{
grammar () : grammar::base_type (value_)
{
using namespace qi;
static auto const null_ = proto::deep_copy ("null" >> qi::attr (null {}));
static auto const bool_ = proto::deep_copy (
"true" >> qi::attr (true) | "false" >> qi::attr (false));
static auto const text_ = proto::deep_copy (
'"' >> qi::raw [*('\\' >> qi::char_ | ~qi::char_('"'))] >> '"');
value_ = null_ | bool_ | text_ | double_ | object_ | array_;
member_ = text_ >> ':' >> value_;
object_ = '{' >> -(member_ % ',') >> '}';
array_ = '[' >> -(value_ % ',') >> ']';
BOOST_SPIRIT_DEBUG_NODES((value_)(member_)(object_)(array_))
}
private:
qi::rule<It, json:: value (), Skipper> value_;
qi::rule<It, json::member (), Skipper> member_;
qi::rule<It, json::object (), Skipper> object_;
qi::rule<It, json:: array (), Skipper> array_;
};
通常我需要将输入解析为 json value,但有时我需要将其解析为 json array 或 json object。我可以在不一遍又一遍地重写相同的语法的情况下做到这一点吗?这些语法之间的唯一区别是入口点?
【问题讨论】:
标签: c++ parsing boost boost-spirit boost-spirit-qi