Come creare un parser che funziona in retromarcia

0

Ho la mia risposta a questo nel commento di quello che ho controllato. Quale approccio algoritmo dovrei prendere per generare Lambda Expressions in Java? ma non so esattamente dove cercare in termini di generazione di espressioni lambda con Parsing in Reverse. Non mi è proprio permesso usare programmi come ANTLR.

Le esercitazioni e le istruzioni che vedo sono le esercitazioni di parsing tradizionali, non riesco a trovare nulla che si riferisce a Parsing in Reverse. C'è un termine più specifico per questo, che posso cercare? Mi dispiace newbie

    
posta nathan De Guia 23.09.2016 - 17:41
fonte

2 risposte

4

L'analisi al contrario è generazione del codice .

Pensa a un compilatore come traduttore: in primo luogo, analizza di solito una struttura di dati intermedia (spesso un albero), quindi cammina su quella struttura di dati intermedia che genera codice per un'altra lingua, a volte come output testuale. Essenzialmente la generazione del codice è l'opposto dell'analisi.

La lingua di output di un compilatore è solitamente più primitiva (cioè codice byte, assembly o codice macchina), ma può anche essere facilmente un altro linguaggio di alto livello.

Vedi, ad esempio, compilatore di chiusura di google (input JavaScript, output JavaScript). Oppure TypeScript, che prende l'input TypeScript per l'output di JavaScript.

Quindi, dovresti provare a codificare il tuo contenuto come un albero e impiegare tecniche di generazione del codice. Oppure codifica come testo e utilizza tecniche di traduzione (analizza il testo in ingresso, genera output di testo).

La traduzione può essere fatta per molte ragioni. Ad esempio, nei primi tempi, diverse implementazioni SQL avevano in realtà una precedenza di operatore diversa! Quindi, la traduzione della tecnologia del compilatore è stata impiegata per prendere SQL scritto per un fornitore e tradurre in SQL completamente tra parentesi per usarlo con un altro.

    
risposta data 23.09.2016 - 17:49
fonte
2

L'analisi al contrario si chiama unparsing o pretty printing . La creazione di un parser che può operare al contrario (invece di creare semplicemente parser e parser separati) è ad esempio trattato nel documento Descrizione sintassi invertibile: Unifying parsing e pretty printing di Tillmann Rendel e Klaus Ostermann , che descrive un meccanismo per avere una singola descrizione della sintassi in grado di operare sia come parser sia come stampante carina . Oltre al codice della carta, esiste anche un pacchetto Haskell chiamato syntax più recente che implementa questa idea.

    
risposta data 23.09.2016 - 19:20
fonte

Leggi altre domande sui tag