50template <
typename PA>
class InstrumentedParser {
52 using resultType =
typename PA::resultType;
53 constexpr InstrumentedParser(
const InstrumentedParser &) =
default;
55 : tag_{tag}, parser_{
parser} {}
56 std::optional<resultType> Parse(
ParseState &state)
const {
57 if (
UserState * ustate{state.userState()}) {
59 const char *at{state.GetLocation()};
60 if (log->Fails(at, tag_, state)) {
63 Messages messages{std::move(state.messages())};
64 std::optional<resultType> result{parser_.Parse(state)};
65 log->Note(at, tag_, result.has_value(), state);
66 state.messages().Annex(std::move(messages));
70 return parser_.Parse(state);