2010-02-14 4 views
6

Je travaille sur un langage spécifique au domaine (DSL) pour les non-programmeurs. Les non-programmeurs font beaucoup d'erreurs grammaticales: ils mal orthographient les mots-clés, ils ne terminent pas les parenthèses, ils ne terminent pas les blocs, etc.Amélioration des messages d'erreur d'analyse syntaxique DSL ANTLR

J'utilise ANTLR pour générer mon analyseur; Il fournit un mécanisme astucieux pour gérer les RecognitionExceptions afin d'améliorer le traitement des erreurs. Mais je trouve qu'il est assez difficile de développer un bon code de gestion des erreurs pour mon DSL. À ce stade, je réfléchis à des moyens de simplifier le langage pour que je puisse plus facilement fournir aux utilisateurs des messages d'erreur de haute qualité, mais je ne suis pas vraiment sûr de la marche à suivre. Je pense que je veux réduire l'ambiguïté des erreurs, mais je ne suis pas sûr de savoir comment mettre en œuvre cette idée dans une grammaire.

De quelles façons puis-je simplifier ma langue pour améliorer les messages d'erreur d'analyse pour mes utilisateurs?

EDIT: Mise à jour pour clarifier que je suis intéressé par les moyens de simplifier ma langue, pas seulement les conseils de gestion des erreurs ANTLR en général. (Bien, merci pour ceux!)

+0

Pouvez-vous nous donner plus d'informations sur la grammaire telle qu'elle est actuellement? A quoi sert votre DSL et de quoi est-il capable? –

+0

http://www.choiceofgames.com/blog/choicescript-intro/ Je signalerai d'emblée que ce n'est pas le moins du monde sans contexte ... –

+1

Si vos utilisateurs font des erreurs courantes, vous pouvez avoir de la grammaire La règle des jetons qui correspondent à l'erreur commune puis affiche ces règles dans un message d'erreur. –

Répondre

0

J'ai récemment lu un article sur quelqu'un qui a implémenté un mécanisme d'apprentissage simple pour son analyseur. Fondamentalement, l'idée est de marquer les erreurs d'analyse que ANTLR vous donne avec la cause réelle de l'erreur. Par exemple,

Error: No method "bar" for NilClass: foo

pourrait être étiqueté comme:

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

L'idée est venue en fait d'un document 2003: Generating LR Syntax Error Messages from Examples. Il a également été discuté sur le blog research!rsc.

+0

est-ce par hasard http://research.swtch.com/2010/01/generating-good-syntax-errors.html qui est apparu sur reddit tout récemment? –

+0

Oui, merci! Ca m'énervait vraiment. – perimosocordiae

1

Vous avez probablement atteint la partie la plus difficile de l'utilisation d'un générateur d'analyseur par rapport à une grammaire roulée à la main. D'après mon expérience, la première chose que vous voulez faire est de vous assurer que vous suivez avec précision les informations de ligne et de colonne afin que vous puissiez pointer l'utilisateur à l'endroit exact où l'analyseur pense que l'erreur est.

Cela devrait prendre en charge 90% des problèmes pour les utilisateurs, c'est-à-dire des virgules ou des points-virgules manquants à la fin d'une ligne.

C'est l'autre 10% est où le problème est.

Je commence normalement en fournissant un nom significatif à mes jetons lexicaux et grammaticaux en utilisant le mot-clé paraphrase.

-à-dire

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

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

Antlr utilisera ces phrases dans un message d'erreur qu'il génère.

Jetez un oeil à cette page: http://www.antlr2.org/doc/err.html pour voir comment les experts vous recommandent de le faire avec Antlr 2 puis de parcourir cette page: http://www.antlr.org/blog/antlr3/error.handling.tml pour voir les changements que Antlr 3 a fait. (La page Antlr2 est probablement le meilleur endroit pour commencer).

4

J'ai écrit un article sur la récupération des numéros de ligne et de colonne dans les erreurs ANTLR il y a quelques années qui pourrait être utile.

http://tech.puredanger.com/2007/02/01/recovering-line-and-column-numbers-in-your-antlr-ast/

+1

Merci. J'ai mis à jour la question pour clarifier que je suis spécifiquement à la recherche de façons de simplifier mon langage, pas seulement les conseils de gestion des erreurs ANTLR en général. –

0

D'accord, je ne l'ai jamais utilisé ANTLR jusqu'à présent, seulement JavaCC. Mais puisque vous allez mettre en œuvre un DSL et se soucient de la convivialité, vous devriez jeter un oeil à xtext. Il est un cadre qui

  • vous permet de spécifier une grammaire textuelle pour votre DSL en notation EBNF
  • génère un analyseur pour vous
  • génère un éditeur avec coloration syntaxique et une rétroaction immédiate sur les erreurs de syntaxe comme un plug-in Eclipse
  • vous donne accès à l'AST sous-jacente pour transformer la représentation textuelle que vos utilisateurs de créer quoi que ce soit dans

J'ai assisté à une présentation par itemis l'année dernière, une société allemande spécialisée dans les DSL. J'ai été très impressionné de voir à quel point ce matériel est facile à mettre en place et à travailler. Je l'ai utilisé pour créer un éditeur pour un petit jeu qui utilise une description textuelle du terrain de jeu qui est ensuite analysée et transformée en modèle objet du jeu.

Questions connexes