Возвышение левой рекурсии в парсере "Правило духа" 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))