2010-02-14 10 views
6

Sto lavorando su un linguaggio specifico del dominio (DSL) per i non programmatori. I non programmatori commettono molti errori grammaticali: sbagliano le parole chiave, non chiudono le parentesi, non terminano i blocchi, ecc.Miglioramento dei messaggi di errore di analisi ANTLR DSL

Sto usando ANTLR per generare il mio parser; fornisce un meccanismo elegante per gestire RecognitionExceptions per migliorare la gestione degli errori. Ma trovo piuttosto difficile sviluppare un buon codice di gestione degli errori per la mia DSL.

A questo punto, sto prendendo in considerazione modi per semplificare il linguaggio per rendere più semplice per me fornire agli utenti messaggi di errore di alta qualità, ma non sono davvero sicuro su come procedere. Penso di voler ridurre l'ambiguità degli errori in qualche modo, ma non sono sicuro di come implementare questa idea in una grammatica.

In che modo è possibile semplificare la lingua per migliorare i messaggi di errore di analisi per i miei utenti?

MODIFICA: Aggiornato per chiarire che mi interessano i modi per semplificare la mia lingua, non solo i suggerimenti per la gestione degli errori ANTLR in generale. (Anche se, grazie per quelli!)

+0

Puoi darci qualche informazione in più sulla grammatica come è adesso? A cosa serve il tuo DSL e di cosa è capace? –

+0

http://www.choiceofgames.com/blog/choicescript-intro/ Ti indicherò subito che non è il minimo in contesto ... –

+1

Se i tuoi utenti commettono errori comuni, puoi avere la grammatica regola i token che corrispondono all'errore comune e quindi fanno in modo che tali regole emettano un messaggio di errore. –

risposta

0

Ho letto di recente un articolo su qualcuno che ha implementato un semplice meccanismo di apprendimento per il suo parser. Fondamentalmente, l'idea è di taggare gli errori di analisi che ANTLR ti fornisce con la causa effettiva dell'errore. Ad esempio,

Error: No method "bar" for NilClass: foo

potrebbe essere etichettata come:

Error: Tried to call "bar" on foo, but foo didn't have a value.

L'idea in realtà è venuto da un documento 2003: Generating LR Syntax Error Messages from Examples. È stato anche discusso nel blog research!rsc.

+0

è per caso http://research.swtch.com/2010/01/generating-good-syntax-errors.html che è apparso su reddit proprio di recente? –

+0

Sì, grazie! Questo mi ha davvero infastidito. – perimosocordiae

1

Probabilmente si ottiene la parte più difficile dell'uso di un generatore di parser rispetto a una grammatica arrotolata a mano.

Dalla mia esperienza, la prima cosa che devi fare è assicurarti di tracciare accuratamente le informazioni di riga e colonna in modo da poter indirizzare l'utente nel punto esatto in cui il parser pensa che l'errore sia.

Questo dovrebbe risolvere il 90% dei problemi per gli utenti, ad esempio mancare virgole o semi-colon alla fine di una riga.

L'altro 10% è dove si trova il problema.

In genere inizio fornendo un nome significativo ai miei token lessicali e grammaticali utilizzando la parola chiave paraphrase.

cioè

SEMI 
options {paraphrase="end of line terminator";} 
: ';' 
; 

ifExpr 
options {paraphrase="boolean expression";} 
    : expr 
; 

Antlr utilizzerà queste frasi in qualsiasi messaggio di errore che esso genera.

Dai un'occhiata a questa pagina: http://www.antlr2.org/doc/err.html per vedere come gli esperti ti consigliano di farlo con Antlr 2 e poi sfoglia questa pagina: http://www.antlr.org/blog/antlr3/error.handling.tml per vedere le modifiche che Antlr 3 ha apportato. (La pagina Antlr2 è probabilmente il miglior punto di partenza).

0

Va bene, non ho mai usato ANTLR finora, solo JavaCC. Ma dal momento che hai intenzione di implementare una DSL e di occuparti dell'usabilità dovresti dare un'occhiata a xtext. E 'un quadro che

  • permette di specificare una grammatica testuale per la vostra DSL in EBNF notazione
  • genera un parser per voi
  • genera un editor con evidenziazione della sintassi e un feedback immediato sugli errori sintattici come un plugin Eclipse
  • dà accesso al sottostante AST di trasformare la rappresentazione testuale che gli utenti di creare in qualsiasi cosa

ho partecipato ad una presentazione da parte itemis l'anno scorso, una società tedesca specializzata in DSL. Sono rimasto molto colpito dalla facilità con cui questa roba è impostata e funziona. L'ho usato per creare un editor per un piccolo gioco che utilizza una descrizione testuale del campo di gioco che viene poi analizzato e trasformato nel modello a oggetti del gioco.