OK, also hier ist eine Frage: Angesichts, dass Haskell ermöglicht Ihnen, neue Operatoren mit beliebigen Vorrang Operator definieren ... Wie ist es möglich, tatsächlich Haskell-Quellcode zu analysieren?Parsing mit benutzerdefinierten Operator Vorrang
Sie können nicht wissen, welche Operatoren Vorrang haben, bis Sie die Quelle analysieren. Sie können die Quelle jedoch erst analysieren, wenn Sie die korrekten Operatorvorgaben kennen. Also ... ähm, wie?
Betrachten wir zum Beispiel, der Ausdruck
x *** y +++ z
Bis wir das Modul beenden die Analyse, wir wissen nicht, was andere Module importiert werden, und damit, was Operatoren (und andere Identifizierungsmerkmale) könnte in Umfang sein. Wir sicherlich kennen ihre Präzedenzfälle noch nicht. Aber der Parser hat etwas zurückkehren ... Aber es sollte zurückkehren
(x *** y) +++ z
Oder sollte es zurückgeben
x *** (y +++ z)
Der arme Parser hat keine Möglichkeit zu wissen. Dies kann nur festgestellt werden, wenn Sie den Import, der (+++)
und (***)
mit sich bringt, in den Gültigkeitsbereich finden, diese Datei von der Festplatte laden und feststellen, was die Operatorvorgaben sind. Offensichtlich wird der Parser selbst nicht alles I/O machen; Ein Parser verwandelt einen Buchstabenstrom in einen AST.
Offensichtlich hat jemand irgendwo herausgefunden, wie man das macht. Aber ich kann es nicht hinkriegen ... Irgendwelche Hinweise?
Sie könnten möglicherweise eine AST mit mehr als zwei Kindern bauen. Nehmen wir an, dieser spezifische Knoten bekommt als Children die Liste '[x, ***, y, +++, z]' ', prüft dann den Vorrang und baut einen Binärknoten auf, der sich danach selbst ersetzt. (Es gibt wahrscheinlich einen besseren Ansatz). – Mephy
Beachten Sie, dass Sie dies auch sehr einfach ohne irgendwelche Hacks tun können, indem Sie einfach zwei Parse-Pässe haben, einen, um die Fixität und Priorität des Operators zu ermitteln, und einen, um den Quellcode zu analysieren. – Cubic