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 :

Erreur Ply et Yacc


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    Par défaut Erreur Ply et Yacc
    Bonjour,
    Je suis en train de débuter avec ply.
    Mon fichier min_lex.py est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    import ply.lex as lex
     
    tokens = (
    	'NUMBER',
    	'ADD_OP',
    	'MUL_OP'
    #	'PLUS',
    #	'MINUS'
    	)
     
    #t_PLUS	= r'\+'
    #t_MINUS	= r'-'
     
    def t_NUMBER (t):
    	r'\d+'
    	t.value = int (t.value)
    	return t
     
    def t_newline(t):
    	r'\n+'
    	t.lexer.lineno += len(t.value)
     
    t_ignore = ' \t'
     
    def t_error(t):
    	print ("Illegal character '%s'" %t.value[0])
    	t.lexer.skip(1)
     
    lex.lex()
     
    if __name__ == "__main__":
    	import sys
    	prog = file (sys.argv[1]).read()
    #	prog = file(sys.argv[1]).read()
    	lex.input(prog)
     
    	while 1:
    		tok = lex.token()
    		if not tok: break
    		print ("line %d: %s(%s)" %(tok.lineno, tok.type, tok.value))
    Mon fichier min_yacc.py est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    import ply.yacc as yacc
    from min_lex import tokens
     
    operations = {
    	'+' : lambda x,y: x+y,
    	'-' : lambda x,y: x-y,
    	'*' : lambda x,y: x*y,
    	'/' : lambda x,y: x/y,
    }
     
    precedence = (
    	('left', 'ADD_OP'),
    	('left', 'MUL_OP'),
    )
     
    #I define operation linked to tokens
     
    def p_expression(p):
    	'''
        expression: expression ADD_OP expression
        | expression MUL_OP expression
            '''
    	p[0] = operations [p[2]](p[1], p[3])
     
    def p_error(p):
    	print ("Erreur de syntaxe sur la ligne %d" % p.lineno)
    	yacc.errork()
     
    yacc.yacc(outputdir = 'generated')
     
    if __name__ == "__main__":
    	import sys
    	prog = file(sys.argv[1]).read()
    	result = yacc.parse(prog)
    	print (result)
    en compilant, j'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ERROR: min_yacc.py:20: Syntax error. Expected ':'
    Traceback (most recent call last):
      File "min_yacc.py", line 29, in <module>
        yacc.yacc(outputdir = 'generated')
      File "/usr/lib/python2.7/dist-packages/ply/yacc.py", line 3106, in yacc
        raise YaccError("Unable to build parser")
    ply.yacc.YaccError: Unable to build parser
    Quelqu'un pourrait-il me dire ce qui cloche SVP? Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 778
    Par défaut
    Salut,

    A la ligne 20, c'est le __doc__ de la fonction autrement dit la grammaire de votre parseur écrit sous forme de BNF-like.
    Python + le codage de la grammaire + lex/yacc, pas facile d'empiler les abstractions sans se prendre les pieds dans le tapis. C'est tellement prise tête que je ne suis pas certain que quelqu'un prendra le temps de réfléchir à votre place.

    Le plus simple serait de partir des exemples, leur appliquer de "petites" variations, tester, intégrer,...

    Bon courage.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    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
    Par défaut
    Justement c'est un exemple que j'ai pris et que je n'ai pas encore modifié. Je demande juste des avis sur l'erreur.
    Merci

  4. #4
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    A la ligne 20, c'est le __doc__ de la fonction autrement dit la grammaire de votre parseur écrit sous forme de BNF-like.
    Et plus précisément, à la ligne 21 (dans ce que tu as posté), ce sont les deux-points ´:´ qui ne devraient pas être accolés à 'expression' et qui provoquent l'erreur au sens de la grammaire de ton parser, pas de celle de Python.

    Si tu ajoutes un espace ... tu auras une autre erreur (de mémoire, je l'ai testé hier mais sur une autre machine) indiquant que le token 'NUMBER' est défini (ligne 5) mais jamais utilisé. Encore une erreur, non pas Python, mais de grammaire du parser.

    Je ne saurai trop te conseiller de suivre les conseils de wiztricks à savoir partir d'exemples corrects donnés sur le site de PLY et d'y aller progressivement en modifiant des petites choses, au coup par coup.

    Et aussi de bien faire la part des choses entre erreurs Python et erreurs de grammaire du parser.

    EDIT :

    Citation Envoyé par dimele
    Justement c'est un exemple que j'ai pris et que je n'ai pas encore modifié
    J'en doute (très) fort.

    D'ailleurs, ça ressemble à ça mais tu as commenté et supprimé tout un tas de choses : c'est ok pour Python, mais pas pour la grammaire de ton parser.

  5. #5
    Membre averti
    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
    Par défaut
    Je n'ai pas pris l'exemple de la calculatrice. Je suis plutôt l'exemple en français parce qu'il est non seulement en français mais permet de voir les choses étape par étape, enrichissant pas à pas la grammaire.

    J'avais effectué les modifications dont tu parles et j'ai comme toi les erreurs sur la grammaire.

    Existe une documentation sur les fonctions yacc?

    Merci

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Par défaut
    Salut,

    je suppose que tu suis le tuto qui se trouve à cette adresse: http://www.matthieuamiguet.ch/media/...eEnMainPLY.pdf
    j'ai vu juste?

    dans ton code , je vois déjà un problème: tes tokens ADD_OP et MUL_OP ne sont définis nulle part.
    il faut les définir de la même manière qu'étaient définis les tokens PLUS et MINUS avec une expression régulière adéquate

    ensuite en testant ton code, plusieurs autres problème apparaissent:
    • il manque la fontion p_expression_num qui défini une "expression"
    • il faut un espace entre "expression" et ":" dans la docstring de la fonction p_expression
    • y a un "r" en trop dans "yacc.errok()"



    et je crois que c'est tout.
    une fois tout ça corrigé, ça devrait être bon... ou pas loin.

  7. #7
    Membre averti
    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
    Par défaut
    Exactement c'est ce tutoriel que je suis. Justement je regarde depuis peu comment dire que t_ADD_OP vaut r'\+' ou r'-' mais je n'y parviens pas.
    J'ai fait ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def t_ADD_OP (t):
    	if ( t.value == '+'):
    		r'\+'
    		t.value = r'\+'
    	elif (t.value == '-'):
    		r'-'
    		t.value = r'-'
    mais ça ne marche pas.
    J'ai aussi tenté ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def t_ADD_OP (t):
    	''' t_ADD_0P: r'\+'
            | r'-'
            '''
    Là, je n'ai pas d'erreurs mais quand je teste avec un fichier contenant 2 + 3, j'obtient Illegal character '+'.

    En plus quand je cherche tout ce qui concerne les expressions régulières, je ne tombe que sur regrex (re) de python

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

Discussions similaires

  1. ignorer erreur syntaxique avec yacc
    Par Hisoka_Hunter dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/01/2009, 13h26
  2. Erreur de syntaxe dans yacc & lex
    Par zarbiman dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 11/02/2008, 19h25
  3. [Yacc] Des messages d'erreur plus clairs ?
    Par zarbiman dans le forum Générateurs de compilateur
    Réponses: 2
    Dernier message: 20/11/2007, 13h13
  4. les messages d'erreurs avec "yacc/bison"
    Par minirop dans le forum C
    Réponses: 6
    Dernier message: 20/12/2006, 18h17
  5. Erreur dans un fichier Yacc
    Par gRaNdLeMuRieN dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 20/08/2005, 20h50

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