2013-05-27 10 views
10

È possibile utilizzare Instaparse o un'altra libreria Clojure per analizzare un linguaggio basato su indentazione? Ho visto esempi di utilizzo di Instaparse per analizzare le grammatiche espresse in EBNF/ABNF. Esiste un buon modo per usarlo per analizzare un linguaggio sensibile all'indentazione come Python?È possibile analizzare un linguaggio basato su indentazione utilizzando Instaparse o altre librerie di clojure?

+0

@chollida: Sto cercando di ottenere consigli su questo problema invece di fare qualcosa di molto hacky. –

+0

Non si ottiene qualcosa di hacky perché hai postato un po 'di quello che stavi cercando di realizzare. – octopusgrabbus

+0

@octopusgrabbus: non sono sicuro di cosa intendi. Le mie opzioni, come le vedo io, sono di rollare il mio parser a mano (hacky), o di usare un generatore di parser, di cui Instaparse sembra essere il più sviluppato.Ma non era affatto ovvio per me come esprimere una grammatica basata su indentazione in A/EBNF, o se Instaparse fosse uno strumento adatto. Da qui la domanda. –

risposta

10

Apparentemente, non sei il primo ad avere questo problema con Instaparse.

Con la maggior parte dei generatori di parser, si risolverebbe questo problema con un lexer personalizzato, utilizzando alcune varianti dello schema proposto da @andrewcooke. Tuttavia, Instaparse è stato progettato per evitare la necessità di un lexer e di conseguenza non fornisce un'interfaccia che ne faccia uso.

Questa mancanza è stata specificatamente sollevata in issue 9, sostituita da issue 10; in quest'ultimo caso, l'autore di Instaparse suggerisce una soluzione alternativa:

Nel frattempo, è possibile adottare una soluzione alternativa. È possibile mappare i token come INDENT e DEDENT ai caratteri non utilizzati e quindi ricostruirli come stringa, quindi eseguire unsparse su quello. Credo che i caratteri ASCII 0-8 e 11-31 non siano usati e potrebbero servire come token.

Questa è certamente una possibilità, anche se è un giudizio estetico sul fatto che sia "fare qualcosa di molto hacky". Tuttavia, potresti scrivere un tale trucco nella speranza che possa essere rimosso una volta risolto il problema 10. Potresti voler unirti alla discussione di quel problema.

+0

Per hacky, principalmente intendevo far rotolare un parser a mano. Questo sembra promettente, proseguirò ulteriormente. Molte grazie. –

8

tipicamente per fare l'analisi rientro a base avete bisogno di tre cose:

  • estendere il tokenizzatore per fare un token dal spazi iniziali su ogni linea

  • processo il flusso di gettoni, per ogni linea di confronto tra gli spazi iniziali nei confronti del contesto attuale e indica se c'è un aumento o una diminuzione (così si cambia avendo un gettone all'inizio di ogni riga ad avere un gettone quando il livello di rientro modifiche)

  • scrittura di un parser "normale" che è a conoscenza dei token che indicano una modifica del livello di rientro .

a seconda della lingua che potrebbe essere necessario per feedback alcune informazioni dalla terza parte alla seconda parte.

non so nulla circa instaparse (l'unica ragione per cui sto rispondendo è che le persone che chiedono "Che cosa hai provato finora?" A domande come questa davvero mi incazzare) in modo avresti bisogno di guarda se c'è un modo per posizionare il secondo stadio tra il tokenizzatore e il parser (ho scansionato i documenti e non sembra avere nulla che faccia la seconda parte per te, ma potresti scrivere tu stesso). ma dovrebbe essere in grado di fare la prima e la terza parte ok.

+0

Grazie, questo è molto utile. –

+1

+1 per il "mi fa davvero incazzare" a parte. :) –

Problemi correlati