OK, ecco una domanda: Dato che Haskell consente di definire nuovi operatori con precedenza arbitraria dell'operatore ... come è possibile analizzare effettivamente il codice sorgente Haskell?Analisi con precedenza utente definita dall'utente
Non è possibile sapere quali sono le precedenze degli operatori impostate finché non si analizza la sorgente. Ma non puoi analizzare la fonte finché non conosci le precedenze degli operatori corrette. Quindi ... um, come?
Si consideri, per esempio, l'espressione
x *** y +++ z
Fino a quando finiamo di analisi del modulo, non sappiamo quali altri moduli sono importati, e quindi ciò che gli operatori (e altri identificatori) potrebbe essere di portata. Noi certamente non conosciamo ancora le loro precedenti. Ma il parser deve restituire qualcosa ... Ma se dovesse tornare
(x *** y) +++ z
O dovrebbe tornare
x *** (y +++ z)
Il povero parser non ha modo di sapere. Questo può essere determinato solo dopo aver scovato l'importazione che porta (+++)
e (***)
nell'ambito, caricare il file dal disco e scoprire quali sono le precedenze dell'operatore. Chiaramente il parser stesso non farà tutto ciò che I/O; un parser trasforma semplicemente un flusso di caratteri in un AST.
Chiaramente qualcuno da qualche parte ha capito come farlo. Ma non riesco a risolverlo ... Qualche suggerimento?
Si potrebbe costruire un AST con più di due bambini. Dì che questo specifico nodo ottiene da bambino la lista '[x, ***, y, +++, z]', quindi controlla la precedenza e costruisci un nodo binario per sostituirsi successivamente. (Probabilmente esiste un approccio migliore). – Mephy
Si noti che si potrebbe fare anche molto facilmente senza alcun hack solo avendo due passaggi di analisi, uno per afferrare la fissità e la precedenza dell'operatore e uno per analizzare effettivamente il codice sorgente. – Cubic