Ich bekomme immer wieder Stapelüberläufe, wenn ich versuche, Spirit zu nutzen, um Sachen zu analysieren

StackOverflow https://stackoverflow.com/questions/1107654

  •  12-09-2019
  •  | 
  •  

Frage

Ich dachte, als ich anfing, Stapelüberlauf zu bekommen, war es Zeit, hierher zu kommen, um zu fragen;)

Ich versuche jetzt zu lernen, wie man Boost Spirit benutzt. Ich habe die grundlegenden Sachen herausgefunden. Da ich K & R Handy hatte (was die Grammatik von C enthält), entschied ich mich zu sehen, ob ich einen Akzeptor für die Sprache machen konnte. Dies war sowieso mehr oder weniger mein ursprüngliches Ziel, da ich dies irgendwann als Präprozessor verwenden möchte, um einige Informationen aus Datenstrukturen und Dingen zu sammeln.

Ich kann Konstanten und Saiten analysieren, aber wenn ich versuche, dies zu analysieren, 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 so etwas wie möglich bin i++ es schlägt fehl. Ich nehme an, das liegt daran i ist gültig primary_expression Und so geht es nicht weiter nach dem ++ oder --. Ich habe versucht, es unten zu stellen, und dann bekomme ich Stapelüberläufe. Ich bekomme hier eine unendliche Rekursion von Left, aber ich weiß nicht, wie ich sie lösen soll.

War es hilfreich?

Lösung

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

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

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

Möglicherweise können Sie ein LALR -basiertes Tool wie Bison besser verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top