Abstrakte Problembeschreibung
So wie ich es sehe, bedeutet Unparsing, einen Token-Stream aus einem AST zu erstellen, der beim erneuten Parsen einen gleichen AST erzeugt, dh parse(unparse(AST)) = AST
halten sollte.
Dies entspricht dem Auffinden eines gültigen Analysebaums, der denselben AST erzeugen würde.
Die Sprache wird durch eine kontextfreie S-zugeschriebene Grammatik unter Verwendung einer eBNF-Variante beschrieben.
Der Unparser muss also einen gültigen 'Pfad' durch die durchquerten Knoten finden, in dem alle Grammatikbeschränkungen gelten. Dies bedeutet im Grunde, eine gültige Zuordnung von AST-Knoten zu Grammatikproduktionsregeln zu finden. Dies ist im Allgemeinen ein Constraint-Zufriedenheitsproblem (CSP) und könnte wie das Parsen durch Zurückverfolgen in gelöst werden .
Zum Glück für das Parsen kann dies in mit GLR (oder besser mit Einschränkung der Grammatik) erfolgen. Da die AST-Struktur der Struktur der Grammatikproduktionsregeln so nahe kommt, war ich wirklich überrascht, eine Implementierung zu sehen, bei der die Laufzeit schlechter als das Parsen ist: XText verwendet ANTLR zum Parsen und Backtracking zum Entparsen.
Fragen
- Ist eine kontextfreie S-Attribut-Grammatik alles, was ein Parser und ein Unparser gemeinsam nutzen müssen, oder gibt es weitere Einschränkungen, z. B. für die Parsing-Technik / Parser-Implementierung?
- Ich habe das Gefühl, dass dieses Problem im Allgemeinen nicht - könnte mir ein Genie dabei helfen?
Ich habe auf StackOverflow keine Antwort auf diese Frage erhalten . Es wurde vorgeschlagen, hier zu fragen, aber ich hasse Redundanz, also hoffe ich, dass Sie mir verzeihen, dass ich Sie gebeten habe, hier zu antworten .