È sufficiente un AST per creare un traduttore? [chiuso]

0

Nota: nella mia ignoranza della differenza tra i siti di Programmer vs StackOverflow (che ora conosco), avevo pubblicato questa domanda su StackOverflow in precedenza. Quello che sto cercando è qualche elaborazione, per esempio, sul commento di Gene.

Una volta sono in grado di creare un albero sintattico astratto (AST) per un input, quindi:

  1. indipendentemente dal tipo di grammatica usata per costruire l'AST (LR, LL *, o persino nessuna grammatica formale come con Perl 5);

  2. indipendentemente dal generatore di parser usato per costruire l'AST ( bison , antlr , o il mio codice scritto a mano); e

  3. indipendentemente dal numero di passaggi che faccio sul mio input per creare l'AST;

... è vero che posso implementare qualsiasi funzione di qualsiasi lingua mai creata semplicemente visitando il N di AST di volte?

Non sono preoccupato per la complessità del codice risultante, o per le sue prestazioni, ho solo bisogno di sapere se un AST è sufficiente per consentire la costruzione di un traduttore (un compilatore o un interprete) indipendentemente dalla funzione che sono cercando di costruire.

Non sto cercando un elenco completo di ciò che non può essere fatto con un AST, solo un esempio dovrebbe essere sufficiente. Se un AST è una struttura sufficientemente fondamentale (e quindi versatile / potente) per consentire la costruzione di quasi tutti i traduttori, allora mi piacerebbe vedere una conferma di questo fatto. Ottenere la fonte del libro o un URL (se ne esiste uno) sarebbe un bonus aggiuntivo.

Proprio come un AST, essendo un albero, la struttura dei dati sarebbe più potente di (e, quindi, può anche emulare) una rappresentazione intermedia o lineare intermedia (IR) come il Codice a tre indirizzi come trattato nel libro del Drago quindi anche un grafico sintattico astratto ( ASG , se vuoi), essendo un grafico, sarebbe più potente di un AST. Quindi, approfondendo ulteriormente il mio post originale: Esiste qualche caratteristica del traduttore nota all'umanità al momento della stesura di questo documento che non può essere implementata da un AST e richiede l'uso di un ASG?

    
posta Harry 09.01.2016 - 04:16
fonte

1 risposta

4

In teoria, sì, supponendo che tu abbia un AST per una lingua completa di Turing. Può significare interpretare a+b come qualcosa che non significa "aggiungi le variabili referenziate da questi due identificatori insieme", o costruisci il tuo compilatore nella lingua di origine per implementare la funzione, o qualcos'altro in particolare impraticabile . Ma una volta modellato un linguaggio di Turing Complete, puoi fare quello che vuoi.

Praticamente però, no. Se la tua lingua di partenza (e AST) non ha concetto di funzioni , allora potrebbe essere difficile implementarle come funzionalità solo tramite le traduzioni AST. Potresti farlo nella lingua originale? Sicuro. Potresti aggiungere nodi AST per supportarlo? Sicuro. Sono abbastanza facili.

Ma cambiare il significato dei nodi di sintassi in qualsiasi modo coerente diventa molto più difficile (ordine di grandezza +).

    
risposta data 09.01.2016 - 04:36
fonte

Leggi altre domande sui tag