2009-07-10 5 views
1

Ich dachte, zu analysieren, wenn ich Stack-Überlauf begann immer es an der Zeit, hierher zu kommen war zu fragen;)Ich halte Stapel überläuft, wenn ich versuche Geist zu verwenden Sachen

Ich versuche zu lernen, wie Boost-Geist Recht zur Nutzung jetzt. Ich habe die grundlegenden Dinge herausgefunden. Da ich K & R handy hatte (was die Grammatik von C enthält), beschloss ich zu sehen, ob ich einen Akzeptor für die Sprache machen könnte. Das war mehr oder weniger mein ursprüngliches Ziel, da ich es irgendwann als Präprozessor nutzen möchte, um Informationen aus Datenstrukturen und anderen Dingen zu sammeln.

Ich bin in der Lage, Konstanten und Strings zu analysieren, aber wenn ich versuche, dies zu parsen, habe ich Probleme.

postfix_expression = 
    primary_expression 
    // omitting some other rules for simplicity's sake 
    | (postfix_expression >> chseq+p("++")) 
    | (postfix_expression >> chseq_p("--")); 

primary_expression = 
    identifier 
    | constant 
    | string_literal; 

// The parsers for constants and strings are 
// pretty trivial so I'm not going to C+P them here. 

Wenn ich passieren in so etwas wie i++ es funktioniert nicht. Ich nehme an, das liegt daran, i ist eine gültige primary_expression und so geht es nicht weiter auf die ++ oder -- zu überprüfen. Ich habe versucht, es auf den Boden zu stellen, und dann bekomme ich Stapelüberläufe. Ich bekomme hier eine unendliche linke Rekursion, aber ich weiß nicht, wie ich es lösen soll.

Antwort

2

Sie müssen die linke Rekursion loswerden. Dieser Wikipedia-Artikel erklärt einige Techniken:

http://en.wikipedia.org/wiki/Left_recursion

Es ist jedoch nicht möglich. C hat eine ziemlich flexible Syntax und bietet möglicherweise nicht genügend Kontext, um einem rekursiven Descent-Parser zu erlauben zu funktionieren, es sei denn, Boost Spirit erlaubt Backtracking. Oder Sie können es tun, aber die Assoziationen werden rückwärts sein.

Sie können besser mit einem LALR-basierten Tool wie Bison sein.