Я очень плохо знаком с peg и pegtl, так что, возможно, я что-то упустил.У меня есть грамматика, очень похожая на следующую:
using namespace tao::pegtl;
struct A : one<'A'> { };
struct B : one<'B'> { };
struct comp : seq<plus<sor<seq<A, B>, A>>,eof> { };
template< typename Rule >
struct test_action : nothing< Rule > {};
template<>
struct test_action<A>
{
template< typename Input >
static void apply(const Input& in)
{
std::cout << "A";
}
};
template<>
struct test_action<B>
{
template< typename Input >
static void apply(const Input& in)
{
std::cout << "B";
}
};
void test()
{
parse< comp, test_action >(memory_input("AAB", ""));
}
Разбор работает отлично, но слишком много активаций test_action :: apply.Программа выводит «AAAB», потому что, если я хорошо понимаю, анализ разбирает первый вариант (AB) для первого символа и завершается неудачей, затем переходит к другому (A).Но даже если он «перематывает», он всегда вызывает test_action :: apply.Как правильно справиться с этой ситуацией?Я намерен вывести «AAB», возможно, без усложнения грамматики.