Scegliere un parser per l'abbellimento del codice

5

Sono in fase di pianificazione della creazione di un abbellitore di codice (simile a AStyle o Uncrustify ) - originariamente stavo per contribuire a uno di quei progetti, ma rivedere la loro fonte mi ha portato alla conclusione che ho diversi obiettivi di progettazione e che la loro fonte è scritta in un modo che rende difficile per un outsider di contribuire facilmente. Ad esempio, AStyle, invece di costruire una sorta di AST, usa oltre 100 variabili di stato come isInComment , foundClassHeader , isLineReady , ecc.

Decido tra l'uso di scanner e generatori di parser (come flex e bison) e scrivere il mio sistema di analisi. Quale sarebbe un approccio migliore? Ho frequentato un corso di compilatore in università, quindi ho una certa esperienza con la scansione e la teoria del parsing. Di seguito sono riportati i vantaggi per cui ho pensato:

Generatori

  • Probabilmente più semplice / veloce da sviluppare
  • Probabilmente più ottimizzato del mio attacco iniziale a un parser personalizzato, sebbene uno personalizzato potrebbe lasciare più margine di miglioramento

Analizzatore personalizzato

  • Probabilmente è più facile eseguire il debug di
  • I programmatori sembrano preferire i lexer e parser personalizzati nelle domande precedenti - "Chiunque voglia un lessico decente non lo fa" t utilizzare Lex "
  • Meno dipendenze
  • Potrebbe consentire un parsing "più sfumato" - poiché sto solo sviluppando un beautifier, il parser non avrebbe bisogno di essere altrettanto severo o dettagliato di uno per un compilatore
  • Parallelizzazione: flex e bisonte (o quello che ho visto di loro) usano lo stato globale. Se voglio analizzare più file contemporaneamente (in thread separati), una soluzione personalizzata sarebbe più semplice da compartimentare
posta Matt Kline 21.05.2013 - 17:37
fonte

1 risposta

3

Non è una scelta tra flex / bisonte o niente. Ci sono diverse opzioni là fuori. Ho usato antlr per un progetto recente e l'ho trovato molto bello con cui lavorare. Alcune cose che potresti non aver considerato:

  • I lessici non sono così difficili, ma i parser hanno un numero considerevole di trucchi che non ti accorgi nemmeno fino a quando non ti colpiscono. Gli strumenti ampiamente utilizzati hanno già risolto un sacco di problemi che non sai nemmeno di esistere.
  • Il tuo parser dovrà essere altrettanto rigoroso di un compilatore. La differenza sarà che puoi usare una grammatica più semplice in alcuni punti, ma ciò sarà probabilmente compensato dal bisogno di usare una grammatica più complessa in altri posti. Ad esempio, gli abbellitori di codice spesso vogliono conservare una nuova riga intenzionale che un normale compilatore si limita a "spazi bianchi". Se la tua lingua ha un preprocessore, un beautifier dovrà incorporarlo nella grammatica, mentre il parser di un compilatore no.
  • Le grammatiche sono estremamente difficili da eseguire il debug. Strumenti come antlr hanno dedicato uno sforzo considerevole alla produzione di utili messaggi di errore. Anche se utilizzi un parser personalizzato, potresti comunque trovare utile utilizzare un generatore di parser esistente per eseguire il debug della grammatica.
risposta data 21.05.2013 - 18:21
fonte

Leggi altre domande sui tag