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

  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 743
    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 743
    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

  8. #8
    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
    Citation Envoy� par dimele Voir le message
    En plus quand je cherche tout ce qui concerne les expressions r�guli�res, je ne tombe que sur regrex (re) de python
    bah la doc du module re de python, c'est exactement ce qu'il te faut pour comprendre la syntaxe demand�e.
    t'auras pas � utiliser les fonctionalit�s du module re, mais ce que tu dois utiliser dans tes script a tr�s exactement la m�me syntaxe que ce que tu utiliserai pour �crire un pattern d'expression r�guli�re.

    je te donne 2 solutions pour d�crire ADD_OP, je te laisserai trouver pour MUL_OP (�a sera pas bien difficile):
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    ADD_OP = r"[+-]"
    # ou
    ADD_OP = r"\+|-"

  9. #9
    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 pense que tu as omis le t_. Ce qui marche est :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    t_ADD_OP = r"\+ | -"
    t_MUL_OP = r'\* | /'
    Sans le t_ , le "Illegal character '+'" demeure.

    Merci

+ 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