Pegjs: [Meisterstück. Anf.] Umkehrung des Parsing-Prozesses

Erstellt am 17. Mai 2018  ·  13Kommentare  ·  Quelle: pegjs/pegjs

Problemtyp

  • Fehlerbericht: Nein
  • Funktionsanfrage: Ja
  • Frage: Ja
  • Kein Problem: Nein

Voraussetzungen

  • Können Sie das Problem reproduzieren?: Ja
  • Haben Sie die Repository-Probleme durchsucht?: Ja
  • Hast du die Foren überprüft?: Welche Foren?
  • Haben Sie eine Websuche durchgeführt (Google, Yahoo usw.)?: Ja!

Beschreibung

Den Fortschritt des Parsings umzukehren wäre großartig.

Erwartetes Verhalten:

Zurückverwandeln eines Objekts in das geparste Format.

Tatsächliches Verhalten:

Ich kann nur das Format parsen, nicht das Objekt zurück in das geparste Format umwandeln.

discussion feature task

Hilfreichster Kommentar

Hi. Ich verstehe das Ziel und den Kontext (warum) Ihrer Anfrage nicht. Eine konkrete Probe könnte helfen.

Beim Parsen wird eine Zeichenfolge als Teil einer Sprache erkannt und optional ein AST erstellt oder ein Ausdruck in der Form ausgewertet (interpretiert): parse(text) --> result
Diese _parse()_-Funktion ist im Allgemeinen keine bijektive Funktion. Daher gibt es keine Garantie, dass Sie das Parsing rückgängig machen können, da Sie beispielsweise Details beim Parsing verwerfen können.

Mit einem AST können Sie Ausdrücke in Text generieren, der einer Sprache entspricht. Dies geschieht im Rahmen der Codegenerierung und Sie können Vorlagen-Engines verwenden, um ASTs in Quellcode umzuwandeln. Diese Aufgabe liegt jedoch außerhalb des Umfangs einer Parsing-Bibliothek.

Alle 13 Kommentare

Hi. Ich verstehe das Ziel und den Kontext (warum) Ihrer Anfrage nicht. Eine konkrete Probe könnte helfen.

Beim Parsen wird eine Zeichenfolge als Teil einer Sprache erkannt und optional ein AST erstellt oder ein Ausdruck in der Form ausgewertet (interpretiert): parse(text) --> result
Diese _parse()_-Funktion ist im Allgemeinen keine bijektive Funktion. Daher gibt es keine Garantie, dass Sie das Parsing rückgängig machen können, da Sie beispielsweise Details beim Parsing verwerfen können.

Mit einem AST können Sie Ausdrücke in Text generieren, der einer Sprache entspricht. Dies geschieht im Rahmen der Codegenerierung und Sie können Vorlagen-Engines verwenden, um ASTs in Quellcode umzuwandeln. Diese Aufgabe liegt jedoch außerhalb des Umfangs einer Parsing-Bibliothek.

Obwohl ich persönlich das Gefühl verstehe, dass die Software in der Lage sein soll, das zu generieren, was sie parsen kann, wie @pjmolina zusammengefasst hat, liegt dies außerhalb des Umfangs dieser Bibliothek (Parser-Generator), daher werde ich dies schließen.

Ich schlage vor, dass Sie einfach Ihren eigenen Codegenerator erstellen, wenn Sie einen vorhandenen für die Sprache verwenden, die Sie analysieren (Sie müssen sicherstellen, dass der AST korrekt ist).

Dieses Ticket ist sehr sinnvoll. Welche andere Bibliothek würden Sie erwarten, um ASTs in Quellcode zu konvertieren, wenn die Grammatik in der PEG.js-Syntax gegeben ist? Ja, das ist derzeit nicht möglich. Die meisten AST werden in Aktionen generiert und können nicht rückgängig gemacht werden. Aber wenn es eine Syntax für die AST-Generierung gibt, über die wir in einem anderen Thema gesprochen haben, macht sie plötzlich nicht nur Sinn, sondern ist auch umsetzbar.

StringTemplate zum Beispiel ist eines der vielen Tools, die Sie für solche Aufgaben verwenden können: Code-Gen von ASTs.

Ich glaube nicht, dass StringTemplate Grammatiken in der PEG.js-Syntax liest.

Kontext:

Um zum Originaltext zurückzukehren, würde ein AST ( A bstract S yntax T ree) nicht ausreichen. Zum Beispiel bei einer JavaScript-Grammatik diese beiden Anweisungen
würde normalerweise die gleiche AST haben, obwohl ihre Syntax etwas anders ist,

// statement 1
var x = 5

// statement 2 - with semicolon
var x = 5;

Um zum ursprünglichen Text zurückkehren zu können, müssen die Aktionen des Parsers eine injektive Funktion sein .

Vorschläge:

Ich persönlich sehe nicht, wie ein solches Feature Teil einer Parsing-Bibliothek sein kann
die auf eingebetteten Benutzeraktionen beruht, um die Ausgabestruktur zu erstellen.

Vielleicht in der Zukunft, wenn pegjs eine Art automatische Parse-Tree-Erstellung haben würde
das wäre machbar.

Bau dein eigenes

Vorausgesetzt, dass innerhalb von Pegjs eingebetteten Aktionen die vollständigen Positionsinformationen verfügbar sind
Sie können Ihre eigenen benutzerdefinierten eingebetteten Aktionen einfügen, um einen CST / ParseTree zu erstellen
und erst in einer Post-Parsing-Phase in einen AST umwandeln.
Sobald Sie ein CST haben, ist das Wiederherstellen der ursprünglichen Eingabe ziemlich trivial ...

Evaluieren Sie eine Parsing-Bibliothek mit automatischer CST / Parse Tree-Erstellung

Hier finden Sie mehrere Kandidaten:
https://tomasetti.me/parsing-in-javascript/

Ich habe beschlossen, mir dies noch einmal anzusehen, aber es muss nach v1 sein, bevor es implementiert werden kann, da dies der Punkt sein wird, an dem die API stabil ist und ich ein Paket veröffentlichen kann, das eine grundlegende gemeinsame AST-Struktur bietet ( zB @pegjs/ast ?). Dieses Paket könnte von Parser-Entwicklern verwendet werden, um ihren eigenen AST abzuleiten, und kann bei Bedarf verwendet werden, um ihn von einem anderen Tool zurück in den Quellcode zu übersetzen (ich denke @pegjs/reverse ).

@futagoza wie geht das?

@Coffee2CodeNL pegjs v1 ist noch nicht draußen.

Nehmen Sie zum Beispiel diesen SVG-Transformationsparser in PEGJS: https://github.com/nidu/svg-transform-parser
Es wäre fantastisch, den Prozess umkehren und die AST wieder in einen String umwandeln zu können.
SVG-Transformationen können also einfach geändert und nicht nur geparst werden.
Ein ähnliches Werkzeug ist Augias .

Kann jemand einige Tools empfehlen, um Code aus AST zu generieren?

@lzane Welcher AST?

@polkovnikov-ph einige angepasste AST, die von PEG generiert wurden

Gibt es ein Tool, das die PEG-Grammatik lesen kann, um die Codegenerierung zu erledigen?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen