Aus der Spitze von meinem Kopf:
I (im Grunde das Gegenteil eines rekursiven anständigen Parser) rekursiv arbeiten würde einig Heuristik über die Verwendung, was mit Bereichen zu tun ((...)
: wahrscheinlich zufällig wählen) optionals (?
: siehe [], unten), Wiederholungen ('' Poisson-Verteilung?). Literale ("..."
) werden einfach in die Ausgabe geschrieben und Untertoken (`<...> ') erzeugen eine Rekursion.
Dies sollte nicht zu schwer sein, es sei denn, Sie wollen eine vollständige Abdeckung garantieren. Selbst dann würde nur eine Bündel von Daten erzeugen eine Hilfe sein ...
[*] Sie müssen optionals weniger als 50% der Zeit schließen unendliche Regress zu verhindern, wenn Regeln der Verarbeitung wie
nonterm: otherstuff <nonterm>?
Guter Fang von plinth.
Ebenso mit Wiederholungen, werfen Sie eine Verteilung, die stark konvergiert.
Sie müssen zuerst die Eingabegrammatik analysieren, wenn sie wie hier in einem BNF-Formular angezeigt wird. Am einfachsten wäre es, ein Mapping (name, string)
zu verwenden und dann mit dem Token der höchsten Ebene zu beginnen (was man annehmen könnte, dass es der erste ist ...).
Dies gibt Ihnen:
("Programm", "<Importe> NEWLINE <Namespace>? ")
(" Importe", ("Import" <Kennung> NEWLINE) *)
...
Die du startest mit "program", hit "<importe>", damit du immer wieder kommst, hist "NEWLINE?", also wirf die würfel und schreibe oder nicht, drücke "<namespace>", so wiederhole ... an Rückkehr du bist fertig.
Ich finde, ich selbst vermute, dass dies zuvor getan wurde. Wenn Sie nur die Ausgabe benötigen, würde ich das Web durchsuchen ... Vielleicht http://portal.acm.org/citation.cfm?doid=966137.966142, obwohl die riesige Anzahl von Parser Generatoren da draußen den Suchraum überfluten ... Versuchen Sie this paper, auch.
BTW-- Ihre lokale Universität hat wahrscheinlich Online-Abonnements für diese Zeitschriften, so dass Sie sie kostenlos erhalten, indem Sie in der Bibliothek zugreifen.
Siehe http://stackoverflow.com/a/41434860/120163 –