Возвышение левой рекурсии в парсере "Правило духа" x3

В настоящее время я застрял с правилом, которое я пытаюсь разобрать с помощью Boost Spirit X3. Вот то, что EBNF (используя оператор% от Spirit для списков) для того, что я пытаюсь проанализировать:

type ::= class_type | lambda_type

lambda_type ::= more_arg_lambda | one_arg_lambda

more_arg_lambda ::= "(", type%",", ")", "=>", type

one_arg_lambda ::= type, "=>", type  <- here is the left recursion

class_type ::= identifier%"::", ["<", type%",", ">"]

usng boost Spirit x3, я пытаюсь разобрать следующую структуру / вариант:

typedef x3::variant<
        nil,
        x3::forward_ast<LambdaType>,
        x3::forward_ast<ClassType>
    > Type;

struct LambdaType {
        std::vector<Type> parameters_;
        Type return_type_;
    };
struct ClassType{
        std::vector<std::string> name_; 
        std::vector<Type> template_args_;
    };

У меня есть живой пример того, что я сейчас пытаюсьВот, который не работает, я также попытался изменить порядок парсера вариантов, который не помогает, я получаю бесконечное отвержение, или не поведение, которое я ожидал (или хотел бы). Кто-нибудь может помочь мне отладить этот парсер? Я думаю, что у меня есть какая-то левая рекурсия в парсере, есть ли шанс избежать этого или нет возможности переписать грамматику? Является ли эта грамматика даже доступной для повышения в духе x3?

РЕДАКТИРОВАТЬ:

Мне удалось уничтожить левую рекурсию в этой грамматике. Теперь грамматика следующая:

type ::= class_type | lambda_type

    lambda_type ::= more_arg_lambda | one_arg_lambda

    more_arg_lambda ::= "(", type%",", ")", "=>", type

    one_arg_lambda ::= class_type, "=>" type, A
                       | "(", type%",", ")", "=>", type, "=>", type, A

    class_type ::= identifier%"::", ["<", type%",", ">"]

    A::= "=>", type, A | eps

но теперь возникает следующая проблема, как я могу сделать бодрость духа х3, чтобы разобрать эти правила в данные структуры? Я не могу себе представить, чтоA илиone_arg_lambda парсеры возвращаются сейчас,one_arg_lambda парсер должен разобрать вLambdaType структура, но в зависимости от того, чтоA разбирает то, что не обязательно правда сейчас. Итак, вопрос теперь в том, как я могу получить рекурсивный анализатор не слева, который разбирает грамматику выше в мои структуры, используя boost-spirit-x3?

РЕДАКТИРОВАТЬ II:

мне бы хотелось=> быть правым ассоциативным такfoo => bar => baz => baham
средстваfoo => (bar => (baz => bahama))

Ответы на вопрос(1)

Ваш ответ на вопрос