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

C Discussion :

les messages d'erreurs avec "yacc/bison"


Sujet :

C

  1. #1
    Nouveau membre du Club Avatar de minirop
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 58
    Points : 36
    Points
    36
    Par défaut les messages d'erreurs avec "yacc/bison"
    bonjour,
    je teste bison et comme erreur j'ai :
    Citation Envoyé par bison
    yacc.y:***.**-**: la r`egle pour ****, qui est un terminal
    par exemple :
    Citation Envoyé par bison
    yacc.y:145.1-6: la r`egle pour VALEUR, qui est un terminal
    pour :
    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
    VALEUR:	NOMBRE { $$ = $1; }
    		| VALEUR PLUS VALEUR { $$ = $1 + $3; }
    		| VALEUR MOINS VALEUR { $$ = $1 - $3; }
    		| VALEUR FOIS VALEUR { $$ = $1 * $3; }
    		| VALEUR DIVISE VALEUR { 
    			if($3 != 0)
    			{
    				$$ = $1 / $3;
    			}
    			else
    			{
    				yyerror("Illegal division by 0");
    				exit(EXIT_FAILURE);
    			}
    		}
    		| PARENTHESE_GAUCHE VALEUR PARENTHESE_DROITE { $$ = $2; }
    ;
    comme union j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    %union {
    	double	dval;
    	int		ival;
    	char	*sval;
    };
    %token <ival> NOMBRE VALEUR
    merci

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Bah oui, VALEUR est un terminal. (on le voit notamment car tu l'as indiqué comme token).

    Dans ton ensemble de production de ta grammaire, chaque production (noté par exemple S -> S1S2S3 | ...): il faut savoir que S ne peut pas être un terminal

    Donc retire le token VALEUR.

    Au passage, c'est très mal vu d'écrire un non terminal en majuscule. On écrit seulement les terminaux en majuscules.

    EDIT :
    Tu es conscient que ton programme ne marchera qu'avec des entiers. Car les $$ sont de types int et il n'est pas possible de remonter d'autres types (tel long). (enfin, ce n'est qu'un seul type dans tout l'arbre)

  3. #3
    Nouveau membre du Club Avatar de minirop
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 58
    Points : 36
    Points
    36
    Par défaut
    merci.

    Citation Envoyé par millie
    EDIT : Tu es conscient que ton programme ne marchera qu'avec des entiers. Car les $$ sont de types int et il n'est pas possible de remonter d'autres types (tel long).
    ?

    et aussi maintenant que j'ai retiré le token "valeur", je ne peux plus utiliser le $X correspondant à "valeur"
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TYPE_VAR MOT EGAL VALEUR { $$ = $4; }
    donne :
    yacc.y:128.93-94: $4 de << DECL_VAR >> n'a pas de type d'eclar'e

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Excuses pour l'edit, je n'avais pas vu le <type> :

    Lis ça :

    Nonterminal Symbols

    When you use %union to specify multiple value types, you must declare the value type of each nonterminal symbol for which values are used. This is done with a %type declaration, like this:

    %type <type> nonterminal...
    http://dinosaur.compilertools.net/bi...n_6.html#SEC52

    Néanmoins, tu auras des problèmes pour gérer des types différents dans ton arbre.

  5. #5
    Nouveau membre du Club Avatar de minirop
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 58
    Points : 36
    Points
    36
    Par défaut


    edit : maintenant j'ai un shift/reduction çà correspond bien à une ambiguité entre deux cas ?

    edit2 : peut on autoriser plusieurs types à un %type ? par ex :
    %token <ival,dval> NOMBRE ?

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par minirop


    edit : maintenant j'ai un shift/reduction çà correspond bien à une ambiguité entre deux cas ?
    Je ne suis pas sûr du message d'erreur, mais c'est sûr que tu as une grammaire ambigüe. Soit tu cherches une grammaire non ambigüe équivalente (ce qui est galère), soit tu donnes des ordres de priorité d'évaluation (et associatif à gauche), du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    %token PLUS MOINS
    %token DIV STAR
     
    %left PLUS MOINS
    %left DIV STAR
    Ici, tous les tokens (PLUS MOINS DIV et STAR) sont définis utilisé avec %left. Les tokens les plus bas ont une priorité plus importante :

    The relative precedence of different operators is controlled by the order in which they are declared. The first %left or %right declaration in the file declares the operators whose precedence is lowest, the next such declaration declares the operators whose precedence is a little higher, and so on.

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par minirop
    peut on autoriser plusieurs types à un %type ? par ex :
    %token <ival,dval> NOMBRE ?

    Non, on peut pas écrire ça, mais tu peux différencier dans la partie analyse lexicale (je ne sais pas si tu en as une), les entiers des double.

    Puis définir VALEUR uniquement de type double. Enfin, personnellement, je ne fais pas comme ça

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/12/2010, 18h05
  2. Message d'erreur avec les serveurs liés
    Par The eye dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 12/03/2008, 11h35
  3. Problème avec les messages d'erreur.
    Par gaet_045 dans le forum JSF
    Réponses: 1
    Dernier message: 01/05/2007, 16h47
  4. recuperer les messages d'erreurs de interbase
    Par devalender dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/06/2004, 12h45

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