Linke Rekursion in Parser-Regel des Geistes x3 beenden

Ich bin momentan mit einer Regel festgefahren, die ich mit Boost Spirit x3 analysieren möchte. Hier ist die EBNF (unter Verwendung des% -Operators von spirit für Listen) für das, was ich zu analysieren versuche:

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, ich versuche, in die folgende Struktur / Variante zu analysieren:

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_;
    };

Ich habe ein Live-Beispiel von dem, was ich gerade versucheHie, was nicht funktioniert, ich habe auch versucht, die Reihenfolge des Varianten-Parsers zu ändern, was nicht hilft, ich bekomme endlose Rückschlüsse oder nicht das Verhalten, das ich erwarten würde (oder wünschen würde). Kann mir jemand beim Debuggen dieses Parsers helfen? Ich glaube, ich habe eine Art von Linksrekursion im Parser. Gibt es eine Möglichkeit, dies zu vermeiden, oder gibt es keine Möglichkeit, die Grammatik neu zu schreiben? Ist dieses Gramar überhaupt mit Boost Spirit x3 zu vergleichen?

BEARBEITEN

Ich habe es geschafft, die linke Rekursion in dieser Grammatik zu eliminieren. Nun ist die Grammatik die folgende:

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

aber jetzt gibt es das nächste problem, wie kann ich boost spirit x3 dazu bringen, diese regeln in die angegebenen structs zu parsen? Ich kann mir nicht vorstellen, was dasA oder derone_arg_lambda Parser kehren jetzt zurück, dasone_arg_lambda Parser sollte in einLambdaType struct, aber je nachdem, wasA analysiert in das ist jetzt nicht notwendig wahr. Die Frage ist nun, wie ich einen nicht-linken rekursiven Parser bekommen kann, der die obige Grammatik mit boost-spirit-x3 in meine Strukturen zerleg

EDIT II:

Ich würde gerne=> richtig assoziativ sein sofoo => bar => baz => baham
meintfoo => (bar => (baz => bahama))

Antworten auf die Frage(2)

Ihre Antwort auf die Frage