Estoy en el proceso de escribir un compilador de juguetes en scala. El idioma de destino en sí se parece a scala, pero es un campo abierto para experimentar.Elegante modelo AST
Después de varias refactorizaciones grandes, no puedo encontrar una buena manera de modelar mi árbol de sintaxis abstracta. Me gustaría usar las funciones de la coincidencia de patrones de scala, el problema es que el árbol lleva información en movimiento (como tipos, símbolos) a lo largo del proceso de compilación.
puedo ver un par de soluciones, ninguna de las cuales me gustan:
clases de casos con campos variables (creo que el compilador de Scala hace esto): el problema es que esos campos no se presentan una cada etapa de la compilación y, por lo tanto, tienen que anularse (u Opción'd) y se vuelve realmente pesado depurar/escribir código. Además, si, por ejemplo, encuentro un nodo con un tipo nulo después de la fase de tipeo, me es muy difícil encontrar la causa del error.
enorme jerarquía de clases rasgo/caja: algo así como Nodo, NodeWithSymbol, NodeWithType, ... parece como un dolor para escribir y trabajar con
mano algo completamente hecho a mano con extractores
Tampoco estoy seguro si es una buena práctica ir con un AST completamente inmutable, especialmente en scala donde no hay intercambio implícito (porque el compilador no está al tanto de la inmutabilidad) y podría perjudicar las actuaciones para copiar el árbol todo el tiempo .
¿Puedes pensar en un patrón elegante para modelar mi árbol usando el potente sistema de scala?
¿Quizás pueda echar un vistazo a JetBrains MPS para algunas inspiraciones? – Jan