Sto scrivendo un compilatore di giocattoli per divertimento.
Fondamentalmente, il mio problema è che non voglio ingombrare l'AST con cose come le informazioni di debug (token simbolici, posizioni dei token, ecc.) così come i dati che l'analizzatore semantico calcola.
Ad esempio, l'analizzatore semantico esegue qualche inferenza di tipo e il tipo di risultato è memorizzato nel tipo di nodo. Sembra qualcosa del genere:
/// A variable declaration in my language looks like this:
/// var x = 10
struct VarDec: Statement {
var varKeyword: Keyword
var varName: Id
var assignment: Symbol
var initializer: Expr
var type: Optional<Type>
}
Il problema principale qui è che ora il tipo di nodo ha uno stato, l'inferenza di tipo è stata fatta o meno. Questo rende difficile ragionare. L'altra cosa è che l'intero AST si ingombra di quei token che sono veramente necessari per i messaggi di errore.
È stato suggerito di creare un'altra rappresentazione dell'AST solo per l'analisi semantica che ricollega all'AST ma sembra un sacco di lavoro e codice ridondante ...
Qualcuno ha un'idea di come posso pulire questo codice senza dover creare più alberi?