mirror of
https://github.com/boostorg/parser.git
synced 2026-02-01 08:42:14 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
41d939b2bc |
@@ -5549,8 +5549,9 @@ namespace boost { namespace parser {
|
|||||||
locals_type locals = detail::make_locals<locals_type>(context);
|
locals_type locals = detail::make_locals<locals_type>(context);
|
||||||
auto params = detail::resolve_rule_params(context, params_);
|
auto params = detail::resolve_rule_params(context, params_);
|
||||||
tag_type * const tag_ptr = nullptr;
|
tag_type * const tag_ptr = nullptr;
|
||||||
|
attr_type attr{};
|
||||||
auto const rule_context = detail::make_rule_context(
|
auto const rule_context = detail::make_rule_context(
|
||||||
context, tag_ptr, retval, locals, params);
|
context, tag_ptr, attr, locals, params);
|
||||||
|
|
||||||
[[maybe_unused]] auto _ = detail::scoped_trace(
|
[[maybe_unused]] auto _ = detail::scoped_trace(
|
||||||
*this, first, last, rule_context, flags, retval);
|
*this, first, last, rule_context, flags, retval);
|
||||||
@@ -5565,9 +5566,22 @@ namespace boost { namespace parser {
|
|||||||
flags,
|
flags,
|
||||||
success,
|
success,
|
||||||
dont_assign,
|
dont_assign,
|
||||||
retval);
|
attr);
|
||||||
if (!success || dont_assign)
|
|
||||||
retval = Attribute_();
|
if (dont_assign)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
attr = attr_type{};
|
||||||
|
|
||||||
|
if constexpr (detail::is_nope_v<decltype(attr)>) {
|
||||||
|
return;
|
||||||
|
} else if constexpr (
|
||||||
|
container<Attribute_> && container<attr_type>) {
|
||||||
|
detail::move_back(retval, attr, detail::gen_attrs(flags));
|
||||||
|
} else {
|
||||||
|
detail::assign(retval, attr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -512,6 +512,45 @@ void github_pr_290()
|
|||||||
BOOST_TEST(*result == "foo");
|
BOOST_TEST(*result == "foo");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace github_issue_294_ {
|
||||||
|
namespace bp = boost::parser;
|
||||||
|
struct Foo
|
||||||
|
{};
|
||||||
|
constexpr bp::rule<struct foo_parser_tag, std::shared_ptr<Foo>> foo_parser =
|
||||||
|
"foo_parser";
|
||||||
|
constexpr auto foo_parser_action = [](auto & ctx) {
|
||||||
|
std::shared_ptr<Foo> & val = _val(ctx);
|
||||||
|
val = std::shared_ptr<Foo>(new Foo{});
|
||||||
|
};
|
||||||
|
constexpr auto foo_parser_def = bp::eps[foo_parser_action];
|
||||||
|
struct Bar
|
||||||
|
{
|
||||||
|
std::shared_ptr<Foo> foo;
|
||||||
|
};
|
||||||
|
constexpr bp::rule<struct bar_parser_tag, std::shared_ptr<Bar>> bar_parser =
|
||||||
|
"bar_parser";
|
||||||
|
constexpr auto bar_parser_action = [](auto & ctx) {
|
||||||
|
std::shared_ptr<Bar> & val = _val(ctx);
|
||||||
|
val = std::shared_ptr<Bar>(new Bar{});
|
||||||
|
std::optional<std::shared_ptr<Foo>> & attr = _attr(ctx);
|
||||||
|
if (attr) {
|
||||||
|
val->foo = attr.value();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
constexpr auto bar_parser_def =
|
||||||
|
(bp::lit("(") > -foo_parser > bp::lit(")"))[bar_parser_action];
|
||||||
|
|
||||||
|
BOOST_PARSER_DEFINE_RULES(bar_parser, foo_parser);
|
||||||
|
}
|
||||||
|
|
||||||
|
void github_issue_294()
|
||||||
|
{
|
||||||
|
namespace bp = boost::parser;
|
||||||
|
using namespace github_issue_294_;
|
||||||
|
|
||||||
|
bp::parse("()", bar_parser, bp::blank);
|
||||||
|
}
|
||||||
|
|
||||||
namespace github_pr_297_ {
|
namespace github_pr_297_ {
|
||||||
namespace bp = boost::parser;
|
namespace bp = boost::parser;
|
||||||
constexpr auto bar_required_f = [](auto& ctx) -> bool {
|
constexpr auto bar_required_f = [](auto& ctx) -> bool {
|
||||||
@@ -558,6 +597,7 @@ void github_pr_297()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
github_issue_36();
|
github_issue_36();
|
||||||
@@ -573,6 +613,7 @@ int main()
|
|||||||
github_issue_279();
|
github_issue_279();
|
||||||
github_issue_285();
|
github_issue_285();
|
||||||
github_pr_290();
|
github_pr_290();
|
||||||
|
github_issue_294();
|
||||||
github_pr_297();
|
github_pr_297();
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user