Ich benutze Perl, um eine JSON-Datei zu analysieren. Wenn alles in Ordnung ist, finde ich passende Klammern gut. Aber wenn es ein Missverhältnis gibt, kann ich mir keinen guten Weg vorstellen, wo es ist.Perl: Gibt es eine Heuristik für das Finden von nicht übereinstimmenden Klammern/Klammern/Parens usw.
Meine Daten an dieser Stelle ist eine sortierte Array (@merged) der Offsets der geschweiften Klammern in der Datei, mit Offsets der schließenden geschweiften Klammern negativ gesetzt.
Hier ist der Abschnitt, der die passenden tut:
@stack=(); foreach $val (@merged) # go through merged array { if ($val>0) { push @stack, $val;} # push every opener onto a stack else { $opn = pop @stack; # when a closer comes up, pop previous opener @tmp = ($opn, abs $val); # array of one match push @matches, [@tmp]; # the array of all matches } }
ich auch Informationen über die Spalte, aber ich will nicht der Algorithmus auf Zwang Formatierung abhängig zu sein.
Ich möchte dies auch an Perl Text anpassen, für die Zeiten, wenn der Übersetzer nur sagt, es gibt eine unübertroffene Klammer am Ende.
Gibt es irgendwelche guten Heuristiken, um den Ort des Mismatch zu finden?
Ein Teil des Grundes, den ich programmiere, ist, etwas zu erledigen, und ein Teil des Grundes ist es zu lernen, zu programmieren. Die Verwendung einer Blackbox dient nicht dieser letzteren Funktion. Außerdem, wenn ich eine Blackbox benutze, sagen wir einen Perl-Interpreter, sagt es mir nie, wo die Klammer fehlt. Es zeigt normalerweise nur auf die letzte Klammer in der Datei und überlässt es mir mühsam, manuell alle Klammern zu überprüfen. Deshalb versuche ich zu sehen, ob es eine Heuristik gibt, die es eingrenzen kann, wo ich nach dem Fehler suchen soll. Es ist einfacher in XML, da die engen "Klammern" explizit sagen, was sie schließen. – user1067305
Nun, Sie können die Quelle des JSON-Parsers hier sehen: http://cpansearch.perl.org/src/MAKAMAKA/JSON-2.90/lib/JSON.pm. Im Allgemeinen ist das Schreiben eines Parsers nicht-trivial und Sie müssen im Grunde einen schreiben, um zu tun, was Sie tun möchten. – xxfelixxx
Wenn Sie Probleme haben, neuen Perl-Code zu schreiben, und nicht mögen, was das Perl -c Ihnen sagt (weil es unklar sein kann, was das Problem ist ..), ist die allgemeine Strategie, mit einem kompilierenden Programm und als zu beginnen Wenn Sie mehr Code hinzufügen, überprüfen Sie, ob der Code noch kompiliert wird. Wenn Sie über ein vorhandenes Programm verfügen, können Sie versuchen, Abschnitte auszukommentieren, bis es kompiliert wird, und Codezeilen dann langsam auskommentieren, um das _real_ Problem zu finden. – xxfelixxx