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

Générateurs de compilateur Discussion :

[Lex/Yacc] Example5.l:8: error: 'yylval' undeclared (first use in this function)


Sujet :

Générateurs de compilateur

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 55
    Points : 39
    Points
    39
    Par défaut [Lex/Yacc] Example5.l:8: error: 'yylval' undeclared (first use in this function)
    Bonjour,

    je suis en train de lire ce tutoriel sur Lex/Yacc
    http://ds9a.nl/lex-yacc/cvs/lex-yacc-howto.html
    J'arrive jusqu'à l'exemple 4 à comprendre et compiler...
    Par contre il y a un soucis avec l'exemple 5.

    Voici le fichier example5.l
    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
    %{
    #include <stdio.h>
    #include "y.tab.h"
    %}
     
     
    %%
    [0-9]+                  yylval=atoi(yytext); return NUMBER;
    heat                    return TOKHEAT;
    on|off                  yylval=!strcmp(yytext,"on"); return STATE;
    target                  return TOKTARGET;
    temperature             return TOKTEMPERATURE;
    \n                      /* ignore end of line */;
    [ \t]+                  /* ignore whitespace */;
    %%

    Le fichier example5.y
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    %{
    #include <stdio.h>
    #include <string.h>
     
    void yyerror(const char *str)
    {
    	fprintf(stderr,"error: %s\n",str);
    }
     
    int yywrap()
    {
    	return 1;
    }
     
    main()
    {
    	yyparse();
    }
     
    %}
     
    %token NUMBER TOKHEAT STATE TOKTARGET TOKTEMPERATURE
     
    %%
     
    commands:
    	| commands command
    	;
     
     
    command:
    	heat_switch
    	|
    	target_set
    	;
     
    heat_switch:
    	TOKHEAT STATE 
    	{
    		if($2)
    			printf("\tHeat turned on\n");
    		else
    			printf("\tHeat turned off\n");
    	}
    	;
     
    target_set:
    	TOKTARGET TOKTEMPERATURE NUMBER
    	{
    		printf("\tTemperature set to %d\n",$3);
    	}
    	;

    et pour compiler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lex example5.l
    yacc -d example5.y
    cc lex.yy.c y.tab.c -o example5
    J'obtiens le message d'erreur suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sh example5.compile 
    example5.l: In function 'yylex':
    example5.l:8: error: 'yylval' undeclared (first use in this function)
    example5.l:8: error: (Each undeclared identifier is reported only once
    example5.l:8: error: for each function it appears in.)
    Avez-vous une idée de la manière de résoudre le problème.

    Merci d'avance

    PS: les exemples sont dispos dans un .tar.gz sur
    http://ds9a.nl/lex-yacc/
    http://ds9a.nl/lex-yacc/cvs/lex-yacc-examples.tar.gz

    PS2: j'ai googler un peu sur le sujet il semble qu'il faille mettre un
    mais je n'ai pas compris où
    je dois le mettre... et pourquoi !

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Poste
    Inscrit en
    Mars 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Poste

    Informations forums :
    Inscription : Mars 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    Dans le fichier example5.l j'ai rajouté la ligne int int yylval;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include "y.tab.h"
    int yylval;
    %}
    J'ai recompilé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ lex example5.l
    $ yacc -d example5.y
    $ cc lex.yy.c y.tab.c -o example5
    Ca fonctionne bien.

  3. #3
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    je crois que ceci est plus correct...

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
     extern YYSTYPE yylval;
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

Discussions similaires

  1. struc undeclared (first use in this function)
    Par Malcolm98 dans le forum C
    Réponses: 6
    Dernier message: 23/03/2015, 20h40
  2. T_ADDR undeclared (first use in this function)
    Par Kaamui dans le forum Débuter
    Réponses: 3
    Dernier message: 17/02/2012, 13h31
  3. libpcap PB undeclared (first use in this function)
    Par guiyomh dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 07/06/2008, 15h43
  4. error: `new' undeclared (first use in this function)
    Par moon93 dans le forum Réseau
    Réponses: 14
    Dernier message: 11/07/2006, 16h57
  5. Réponses: 23
    Dernier message: 19/01/2006, 23h34

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