2010-02-14 7 views
6

Ich arbeite an einer domänenspezifischen Sprache (DSL) für Nicht-Programmierer. Nicht-Programmierer macht viele Grammatikfehler: sie Schlüsselwörter falsch schreiben, tun sie nicht in der Nähe Klammern, sie Blöcke nicht beenden, usw.Verbessern ANTLR DSL Parse-Fehlermeldung

ich ANTLR bin mit meinem Parser zu erzeugen; Es bietet einen raffinierten Mechanismus für die Behandlung von RecognitionExceptions, um die Fehlerbehandlung zu verbessern. Aber ich finde es ziemlich schwer, einen guten Fehlerbehandlungscode für mein DSL zu entwickeln.

An diesem Punkt überlege ich Möglichkeiten, die Sprache zu vereinfachen, um es mir zu erleichtern, Benutzer mit qualitativ hochwertigen Fehlermeldungen zu versorgen, aber ich bin nicht wirklich sicher, wie das geht. Ich denke, ich möchte die Mehrdeutigkeit von Fehlern irgendwie reduzieren, aber ich bin mir nicht sicher, wie ich diese Idee in einer Grammatik umsetzen soll.

Inwiefern kann ich meine Sprache vereinfachen, um die Syntaxanalysefehler für meine Benutzer zu verbessern?

EDIT: aktualisiert klarstellen, dass ich in einer Weise interessiert bin meine Sprache zu vereinfachen, nicht nur ANTLR Fehlerbehandlung Tipps im Allgemeinen. (Aber danke für diese!)

+0

Können Sie uns mehr Informationen über die Grammatik geben, als sie gerade ist? Wofür ist dein DSL gut und wozu ist es geeignet? –

+0

http://www.choiceofgames.com/blog/choicescript-intro/ Ich werde auf Anhieb darauf hinweisen, dass es nicht das kleinste bisschen kontextfrei ist ... –

+1

Wenn Ihre Benutzer häufige Fehler machen, können Sie Grammatik haben Token-Regeln, die mit dem allgemeinen Fehler übereinstimmen und diese Regeln dann eine Fehlermeldung ausgeben lassen. –

Antwort

0

Ich habe kürzlich einen Artikel über jemanden gelesen, der einen einfachen Lernmechanismus für seinen Parser implementiert hat. Grundsätzlich besteht die Idee darin, die Parse-Fehler, die ANTLR Ihnen gibt, mit der tatsächlichen Ursache des Fehlers zu versehen.

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

Die Idee tatsächlich von einem 2003 Papier kam: Zum Beispiel

Error: No method "bar" for NilClass: foo

könnte als markiert werden Generating LR Syntax Error Messages from Examples. Es wurde auch im Blog research!rsc diskutiert.

+0

ist es zufällig http://research.swtch.com/2010/01/generating-good-syntax-errors.html die erst kürzlich auf reddit erschienen ist? –

+0

Ja, danke! Das nervte mich wirklich. – perimosocordiae

1

Sie haben wahrscheinlich den schwierigsten Teil der Verwendung eines Parser-Generators im Vergleich zu einer handgerollten Grammatik gefunden.

Nach meiner Erfahrung sollten Sie als Erstes sicherstellen, dass Sie die Zeilen- und Spalteninformationen genau verfolgen, damit Sie den Benutzer genau an die Stelle führen können, an der der Parser den Fehler vermutet.

Das sollte 90% der Probleme für Benutzer kümmern, dh fehlende Kommas oder Semikolons am Ende einer Zeile.

Es ist die anderen 10% ist, wo das Problem ist.

Ich fange normalerweise an, indem ich meinen lexikalischen und Grammatik-Tokens unter Verwendung des Schlüsselwortes paraphrase einen aussagekräftigen Namen gebe.

dh

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

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

Antlr werden diese Sätze in jeder Fehlermeldung verwenden, die es erzeugt.

Werfen Sie einen Blick auf diese Seite: http://www.antlr2.org/doc/err.html zu sehen, wie die Experten empfehlen Sie es mit Antlr tun 2 und dann diese Seite überfliegen: http://www.antlr.org/blog/antlr3/error.handling.tml die Änderungen zu sehen, die Antlr 3 gemacht hat. (Die Antlr2-Seite ist wahrscheinlich der beste Ort zum Starten).

0

Okay, habe ich ANTLR bisher nie benutzt, nur JavaCC. Aber da Sie ein DSL implementieren und sich um die Benutzerfreundlichkeit kümmern, sollten Sie einen Blick auf xtext werfen. Es ist ein Rahmen, der

  • Sie eine Textgrammatik für Ihren DSL in EBNF Notation für Sie
  • erzeugt einen Editor mit Syntaxhervorhebung und unmittelbares Feedback auf syntaktische Fehler als Eclipse-Plugin
  • erzeugt einen Parser angeben können
  • geben Sie auf den darunter liegenden AST Zugriff auf die Textdarstellung, die Ihre Nutzer in etwas

ich voneine Präsentation besucht erstellen zu transformierenletztes Jahr, ein deutsches Unternehmen, das sich auf DSL spezialisiert hat. Ich war ziemlich beeindruckt, wie einfach es ist, sich einzurichten und zu arbeiten. Ich habe es verwendet, um einen Editor für ein kleines Spiel zu erstellen, der eine Textbeschreibung des Spielfelds verwendet, die dann analysiert und in das Objektmodell des Spiels umgewandelt wird.