Boost.Spirit Parser crasht mit Segfault -
-
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?
-
Also ich hatte nie Probleme mit
flexundbison.
-
Ich schaue mir gerade deinen Code an:
ich würde ja die Variablen als Kleinbuchstaben lassen. Das macht die Sache eindeutig zu parsen (in LL(1))
Alternative Formulierung für Aussage:
( !() ist 0 oder 1 mal)
Aussage := ("T" | "F" | "(" Aussage ")" | "NOT" Aussage | Variable [Index]) !( "AND" Aussage | "OR" Aussage )
-
otze schrieb:
Aussage := ("T" | "F" | "(" Aussage ")" | "NOT" Aussage | Variable [Index]) !( "AND" Aussage | "OR" Aussage )Teste ich gleich mal.
-
Verdammt Otze...

Wieso tust du so etwas? Jetzt hab ich NIX gelernt.

Einzig und allein gibt es den Fehler, dassasdf4
Als falsch ausgewertet wird. Aber das fix ich selber

Ich werde aber auch noch einmal eine Version mit WhaleCalf machen (die API, die das Problem mit unsigned char hatte). Die ist zwar todeshässlich, doch ist es mal eine Erfahrung wert mit todeshässlichen APIs zu arbeiten.