2009-10-14 9 views
1

Je me demandais comment pourrait-il être possible de formater dans un format lisible par l'homme un ParseException jeté par JavaCC: en fait, il comprend des domaines tels que beginLine, beginColumn, endColumn, endLine dans la référence symbolique de l'exception , mais pas la référence à la source analysée.Format ParseException avec JavaCC

Merci! :)

Répondre

1

Le problème est que, par défaut, JavaCC ne conserve pas les données sources brutes. Donc, à moins de garder une référence aux jetons, ils ne sont pas gardés en mémoire. Et même si vous étiez accroché à tous les jetons habituels, vous auriez besoin d'ajouter une manipulation spéciale pour tous les jetons SKIP que vous auriez définis - par exemple, pour ignorer les espaces et les commentaires. La raison pour laquelle JavaCC ne conserve pas tout cela est qu'il utiliserait davantage de mémoire que le lot.

Garder toutes les images symboliques est définitivement faisable ... il suffit d'une intervention semi-manuelle.

+0

Tom! Il y a longtemps que nous n'avons pas discuté! : D (nous sommes aussi amis sur FB et nous ne parlons même pas de ces choses là ...: D) Quoi qu'il en soit, imaginez que je mette un StringBuffer qui conserve tous les jetons valides analysés, le problème serait alors pour obtenir la bonne colonne et la ligne pour commencer: Imaginez que je devais construire la chaîne d'erreur en fournissant des caractères avant et certains après le point de l'erreur ... avez-vous une solution pour cela? :) – user189603

0

Je ne sais pas si elle est assez, mais vous pouvez utiliser la propriété currentToken de attrapée ParseException objet:

try { 
parser.Start(); 
    } 
    catch(ParseException e){ 
     System.out.println("Problem with code!"); 
     System.out.println("Unknown symbol >> " 
      + e.currentToken.image 
      + " << Line:" + e.currentToken.beginLine 
      + ", column:" + e.currentToken.beginColumn); 
     //e.printStackTrace(); 
    } 
0

Il suffit de garder le nom du fichier avant d'appeler l'analyseur. Ensuite, lorsque vous attrapez ParseException, relisez le fichier et, en utilisant beginLine, passez à la ligne droite. Sinon, au lieu du nom de fichier, conservez le texte source d'origine vous-même.

J'ai récemment utilisé javacc et fait exactement cela. J'ai également dû gérer des fichiers de type récursif de façon à ce que l'analyseur construise une pile de fichiers sources inclus. En interceptant ParseException, il était simple de parcourir la pile pour que l'utilisateur puisse voir le contexte (c'est-à-dire le numéro de ligne dans le parent) où chaque fichier était inclus.

Questions connexes