Boost.Spirit Parser crasht mit Segfault -
-
Danke schonmal, jedoch gibt es AFAIR überhaupt keine LIB für Spirit, oder?
-
Du erzeugst einen Stackoverflow, wenn expression boolean nicht matchen kann, dann binary_logic_expr zu matchen versucht und gleich wieder in den expression-Parser geht. So, wie deine Grammatik da steht, ist es keine LL-Grammatik, und du wirst sie umformulieren müssen, um sie mit Spirit zu parsen.
-
seldon schrieb:
Du erzeugst einen Stackoverflow, wenn expression boolean nicht matchen kann, dann binary_logic_expr zu matchen versucht und gleich wieder in den expression-Parser geht. So, wie deine Grammatik da steht, ist es keine LL-Grammatik, und du wirst sie umformulieren müssen, um sie mit Spirit zu parsen.
Wahnsinn! Hast Recht. Also lag es an der Rekursion. Was würd' ich bloß ohne Seldon machen...

Soll ich vielleicht einfach Boost.Regex nehmen?
-
Seldon, wie würdest du es denn machen? Also die ursprüngliche EBNF kann man mit Spirit nicht parsen?
-
Die Sprache, die du zu parsen versuchst, ist nicht regulär, also wird boost.regex dich nicht groß weiterbringen. Die ursprüngliche EBNF wird man wohl mit einem LR-Parsergenerator verarbeitet kriegen (wie bison oder yacc), aber Spirit baut ja im Grunde nichts anderes als einen Recdesc-Parser, also LL, und dort kann man halt keine linksrekursiven Regeln haben.
Das hier könnte dir bei der Umstellung helfen, wie wahrscheinlich auch ein Blick in dein Vorlesungsskript. Du erwartest aber hoffentlich nicht, dass ich dir deine Hausaufgaben abnehme.
-
seldon schrieb:
Du erwartest aber hoffentlich nicht, dass ich dir deine Hausaufgaben abnehme.
Niemals, das wäre nicht nur eine peinliche Schande, sondern außerdem ist das keine Hausaufgabe.
Danke für den Link!
-
Gut, was ich herausgefunden habe, ist dass die meisten LR-Parsergeneratoren Grammar-Files nutzen. Die sind komplex strukturiert; basil sieht gut aus. Sehe ich mir mal an.
-
@seldon: Du kennst nicht zufaellig eine Einfuehrung in Grammatiken und deren Grundbegriffe?

-
UltraGram ist klasse, und perfekt für meine Zwecke geeignet.

-
IIIIEEEEHH!!
UltraGrams Codegenerator produziert Code mit malloc/realloc/free!

Ich werde erstmal ein Viertelstündchen heulen. Darf sowas nicht jeden Tag machen.
-
Und was ist das bitte für ein OOP-Modell, in dem Klassen nicht mal ihre eigenen Abhängigkeiten bereitstellen? Jetzt muss ich einen Haufen Header einbinden -.-

-
Ich habe heute eine sehr wichtige Lektion gelernt. Acuh wenn Ultragram einen schönen Editor hatte, usw.
War Whalecalf doch so geil und hatte richtiges C++ auf Lager (inkl. Templates, C++-Streams, schön generisch alles, usw.).
-
Und wieder Blödsinn.
Da wirdstdund ein anderer Namespace mitten im Header geöffnet...
-
wie wärs einfach, wenn du die Grammatik umformulierst, sodass sie LL ist? das ist nicht so schwer.
-
otze schrieb:
wie wärs einfach, wenn du die Grammatik umformulierst, sodass sie LL ist? das ist nicht so schwer.
Na ich weiß nicht, ich will lieber noch einige Dutzend Stunden mit WhaleCalf verbringen

Ich versuch mich mal mit Umformulierung. Mal sehen, was bei rauskommt.
-
Der Trick ist, dass du das so mformulieren kannst, dass du erst etwas liest, was keine Aussage ist und erst dann ein "and" oder "or" optional folgt.
-
Sone schrieb:
[...] ich will lieber noch einige Dutzend Stunden mit WhaleCalf verbringen

... dann hast wenigstens keine Zeit im Forum zu nerven 
-
otze schrieb:
Der Trick ist, dass du das so mformulieren kannst, dass du erst etwas liest, was keine Aussage ist und erst dann ein "and" oder "or" optional folgt.
Und die Klammern und NOT. Also praktisch ein Baum:
NOT (T AND F)Wird zu
NOT //UND SCHLIEßLICH DAS / BRACED_EXPR //DANN DAS / AND // DANN DAS / \ T F //ZUERST LESEN (Oder Variable >> !Index)Oder geh ich wieder in die falsche Richtung?
-
das einzige was du verhindern musst, ist dass "Aussage" linksrekursiv ist (das heißt, der Parser darf nicht ohne irgendetwas zu lesen die Ableitung Aussage->Aussage->Aussage->Aussage anwenden können. Schreib die Regeln einfahc so um, dass immer mindestens 1 Zeichen gelesen wird.
-
Bevor ich das jetzt angehe: Ist danach die Syntax die selbe?