Eliminando a recursão esquerda na regra de espírito do analisador x3
Atualmente, estou preso a uma regra que estou tentando analisar usando o boost spirit x3. Aqui está o EBNF (usando o operador% from spirit para listas) para o que estou tentando analisar:
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, estou tentando analisar a seguinte estrutura / variante:
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_;
};
Eu tenho um exemplo ao vivo do que estou tentando atualmenteaqui, que não está funcionando, também tentei alterar a ordem do analisador de variantes, o que não ajuda, recebo recusões sem fim ou não o comportamento que eu esperaria (ou desejaria). Alguém pode me ajudar a depurar esse analisador? Acho que tenho algum tipo de recursão à esquerda no analisador, existe uma chance de evitar isso ou não há chance de reescrever a gramática? Esse gramar é parsável com o boost spirit x3?
EDITAR:
Consegui eleminar a recursão esquerda nesta gramática. Agora, a gramática é a seguinte:
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
mas agora há o próximo problema, como posso fazer o boost spirit x3 analisar essas regras nas estruturas fornecidas? Não consigo imaginar o queA
ou oone_arg_lambda
analisadores estão retornando agora, oone_arg_lambda
analisador deve analisar em umLambdaType
estrutura, mas dependendo do queA
analisa o que não é necessário agora. Portanto, a questão agora é: como posso obter um analisador recursivo não esquerdo, que analisa a gramática acima em minhas estruturas usando o boost-spirit-x3?
EDIÇÃO II:
eu gostaria=>
estar certo associativo assimfoo => bar => baz => baham
significafoo => (bar => (baz => bahama))