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))