Elección de la recursión izquierda en el parser rule of spirit x3
Actualmente estoy atascado con una regla que estoy tratando de analizar usando boost spirit x3. Aquí está el EBNF (usando el operador% de espíritu para las listas) para lo que estoy tratando de analizar:
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, estoy tratando de analizar la siguiente estructura / 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_;
};
Tengo un ejemplo en vivo de lo que estoy intentando actualmenteaquí, que no funciona, también intenté cambiar el orden del analizador de variantes, lo que no ayuda, obtengo una reclusión interminable o no el comportamiento que esperaría (o desearía). ¿Alguien puede ayudarme a depurar este analizador? Creo que tengo algún tipo de recursión izquierda en el analizador, ¿hay alguna posibilidad de evitar esto o no hay posibilidad de reescribir la gramática? ¿Se puede analizar esta gramática con boost spirit x3?
EDITAR:
Logré eliminar la recursión izquierda en esta gramática. Ahora la gramática es la siguiente:
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
pero ahora está el siguiente problema, ¿cómo puedo hacer que Boost Spirit x3 analice estas reglas en las estructuras dadas? No puedo imaginar lo que elA
o laone_arg_lambda
los analizadores están volviendo ahora, elone_arg_lambda
analizador debe analizar en unLambdaType
struct, pero dependiendo de quéA
analiza eso no es necesariamente cierto ahora. Entonces, la pregunta es ahora, ¿cómo puedo obtener un analizador recursivo no izquierdo, que analiza la gramática anterior en mis estructuras usando boost-spirit-x3?
EDITAR II:
Me gustaría=>
para ser correcto asociativo por lofoo => bar => baz => baham
mediofoo => (bar => (baz => bahama))