IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Gestion des erreurs de parsing avec PLY


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 41
    Points : 34
    Points
    34
    Par défaut Gestion des erreurs de parsing avec PLY
    Bonjour,
    Avec PLY, j'essaie d'afficher un message d'erreur genre Erreur de syntaxe à la ligne 3
    J'ai pour ma fonction p_error comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def p_error(p):
    	flag_for_error = 1
    	print ("Erreur de syntaxe sur la ligne %d" % (p.lineno))
    	yacc.errok()
    J'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print ("Erreur de syntaxe sur la ligne %d" % (p.lineno))
    AttributeError: 'NoneType' object has no attribute 'lineno'
    En lisant le code du fichier yacc.py contenu dans le module PLY j'ai remarqué que la fonction lineno prenait plutôt en paramètre un numero de ligne et donnait le token s'y trouvant .

    Et je ne trouve pas la fonction à utiliser. Quelqu'un pourrait-il m'aider?

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par dimele Voir le message
    Bonjour,
    J'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print ("Erreur de syntaxe sur la ligne %d" % (p.lineno))
    AttributeError: 'NoneType' object has no attribute 'lineno'
    En lisant le code du fichier yacc.py contenu dans le module PLY j'ai remarqué que la fonction lineno prenait plutôt en paramètre un numero de ligne et donnait le token s'y trouvant .

    Et je ne trouve pas la fonction à utiliser. Quelqu'un pourrait-il m'aider?

    Merci
    Bonjour,

    Ici, l'exception AttributeError vous indique que le paramètre p ne contient pas d'objet susceptible d'avoir l'attribut lineno puisqu'il vaut None.

    Commencez peut-être par tracer pourquoi cette fonction est appelée avec un paramètre p = None (avant de chercher les problèmes inhérents à lineno) ?

    @+.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Bonjour,
    Après avoir lu les docs et profiler et reprofiler mon code, j'ai trouvé ce qui n'allait pas.
    Dans mon mini langage, j'ai défini des blocs. Lorsque j'ai des erreurs à la dernière ligne d'un bloc, le parsing donne en paramètre à la fonction p_error(p) un objet None.

    J'essaie de comprendre ce qui se passe et je reviens quand j'en saurai plus. N'hésitez pas si vous avez des pistes.

    Merci

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2014
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    Il me semble qu'il ne faut pas utiliser p.lineno, mais plutôt p[i].lineno où p[i] va correspondre au token que tu as parsé et qui commet l'erreur.
    Je ne suis pas tout à fait sur, je vérifierais lorsque j'aurai à nouveau les sources de PLY.

    Sans indiscrétion, mais parce que ça m'intéresse, tu souhaites réaliser du parsing de quoi ?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Bonjour,
    C'est bien p[i].lineno qui est utilisé. Mais le p.lineno aussi fonctionne.
    Je l'ai utilisé parce que je me dit que le token erroné est celui qui est passé en paramètre à la fonction p_error(p).

    Pour l'histoire, je suis en train de me faire un mini langage.
    L'utilisateur écrit son code dans un environnement (une interface web) et après validation, je cherche et lui renvoie (s'il y en a) les erreurs de syntaxe qu'il a faites.

    Voili voilouuu. Si tu veux plus de détails fais moi signe.

    Merci

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2014
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    Ah ok, c'est intéressant ! As-tu trouvé une solution à ton problème ?

    C'est un peu le bordel la gestion des indices et des variables car le framework PLY est assez complexe à utiliser. Documenté, mais pas assez en détail. Tu devrais regarder sur le projet pycparser (c'est à partir de ce projet que je travaille), pour parser du C. Dans le fichier c_parser.py, il y a une méthode p_error. Tu pourras regarder ce qu'il utilise pour les messages d'erreurs.

    Déjà, ce qui pourrait être utile pour comprendre, c'est les paramètres d'entrées de ta méthode p_error. Tu es au niveau de l'analyse syntaxique, ou lexical ? Si p est un token, tu devrais avoir accès à son numéro de ligne et de colonne (à voir avec la classe LexToken). Si p est un yaccProduction, ça va être un peu plus compliqué.

    Je ne sais pas quel IDE tu utilises, mais cela pourrait être intéressant pour toi, d'utiliser le mode debug pour connaître le type des objets sur lesquels tu travailles, et, grâce à la complétion automatique (se méfier quand même parfois), accéder aux attributs de ces objets.

    Voilà, n'hésites pas à donner plus de détail, si tu souhaites davantage d'aide.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Salut,
    J'ai finalement résolu mon souci. Voici le bon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def p_error(p):
    	global flag_for_error
    	flag_for_error = 1
     
    	if (p is not None) :
    		global error_list 
    		error_list.append ("Erreur de syntaxe sur la ligne %d" % (p.lineno))
    		yacc.errok()
    	else:
    		error_list.append ("Fin d'input innatendu")
    Ce qui était à l'origine de ma boucle infini est la ligne que j'avais ajouté à ma clause else.
    Elle sert à faire croire au parseur qu'il n'y a pas d'erreurs et de continuer sa route comme si de rien n'était.
    Mais face à une fin inattendue de fichier, le parseur bouclait dessus. Enfin je crois.

    Merci Nairolf21 pour tes lumières. Je vais aussi regardé plycparser. Encore merci
    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. gestion des erreurs avec fichier .properties
    Par _momo dans le forum Struts 1
    Réponses: 2
    Dernier message: 20/08/2007, 14h05
  2. Réponses: 8
    Dernier message: 15/10/2006, 18h45
  3. [debutant]J'ai du mal avec la gestion des erreurs
    Par gillou13 dans le forum Langage
    Réponses: 5
    Dernier message: 02/06/2006, 14h33
  4. [J2EE/JSP] Gestion des erreurs avec une base SQL server 2005
    Par critok dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 30/04/2006, 16h57
  5. Gestion des erreurs avec setjump/longjump
    Par gege2061 dans le forum C
    Réponses: 1
    Dernier message: 05/02/2006, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo