Sono in procinto di scrivere un compilatore di giocattoli in scala. La lingua di destinazione stessa sembra scala, ma è un campo aperto per l'esperimento.Elegante modello AST
Dopo diversi grandi refactoring non riesco a trovare un buon modo per modellare il mio albero di sintassi astratto. Mi piacerebbe utilizzare le funzionalità di corrispondenza dello schema di scala, il problema è che l'albero trasporta informazioni mobili (come tipi, simboli) lungo il processo di compilazione.
riesco a vedere un paio di soluzioni, nessuna delle quali mi piace:
classi case con i campi mutabili (credo che il compilatore Scala fa questo): il problema è che questi campi non sono presenti un ogni fase della compilation e quindi deve essere annullata (o Option'd) e diventa davvero pesante per il debug/write code. Inoltre, se per esempio, trovo un nodo di tipo null dopo la fase di digitazione, ho davvero difficoltà a trovare la causa del bug.
enorme gerarchia trait/caso classe: qualcosa come Node, NodeWithSymbol, NodeWithType, ... sembra un dolore per scrivere e lavorare con
qualcosa di completamente lavorato a mano con estrattori
Non sono nemmeno sicuro se sia una buona pratica andare con un AST completamente immutabile, specialmente in scala dove non c'è una condivisione implicita (perché il compilatore non è consapevole dell'immutabilità) e potrebbe danneggiare le prestazioni per copiare l'albero tutto il tempo .
Riesci a pensare a un modello elegante per modellare il mio albero utilizzando il potente sistema di tipi di scala?
Forse potresti dare un'occhiata a JetBrains MPS per alcune ispirazioni? – Jan