Ou sont les erreurs de ce code?

Résolu
jihado86 Messages postés 13 Date d'inscription samedi 25 avril 2009 Statut Membre Dernière intervention 28 mai 2009 - 20 mai 2009 à 16:17
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 20 mai 2009 à 17:38
voilà ce code Lex que j'ai fait pour analyser un code c, mais il y a des erreurs qui disent "unrecognised rule" mais j'ai rien trouvé ces erreurs, alors pouvez vous me dire ou sont les erreurs dans ce code suivant?

%{
#include ”monyacc.tab.h”
#include <stdio.h>
#include <string.h>
extern YYSTYPE yylval;
FILE * fichier;
%}
chars [A-Za-z]
numbers ([0-9]+)
var ([A-Za-z0-9]+)
op "+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"!"|"="|"<"|">"
ponct "{"|"}"|"["|"]"|"("|")"|";"|":"|"?"|"."|"#"
expr {var,op,ponct}+
type "int" | "char" | "float"
%%
"{"    { yylval=(YYSTYPE);strdup(yytext);return '{'; }
"}"    { yylval=(YYSTYPE);strdup(yytext);return '}'; }
"["    { yylval=(YYSTYPE);strdup(yytext);return '['; }
"]"    { yylval=(YYSTYPE);strdup(yytext);return ']'; }
"("    { yylval=(YYSTYPE);strdup(yytext);return '('; }
")"    { yylval=(YYSTYPE);strdup(yytext);return ')'; }
";"    { yylval=(YYSTYPE);strdup(yytext);return ';'; }
","    { yylval=(YYSTYPE);strdup(yytext);return ','; }
":"    { yylval=(YYSTYPE);strdup(yytext);return ':'; }
"."    { yylval=(YYSTYPE);strdup(yytext);return '.'; }
"|"    { yylval=(YYSTYPE);strdup(yytext);return '|'; }
"!"    { yylval=(YYSTYPE);strdup(yytext);return '!'; }
"?"    { yylval=(YYSTYPE);strdup(yytext);return '?'; }
"&"    { yylval=(YYSTYPE);strdup(yytext);return '&'; }
"+"    { yylval=(YYSTYPE);strdup(yytext);return '+'; }
"-"    { yylval=(YYSTYPE);strdup(yytext);return '-'; }
"*"    { yylval=(YYSTYPE);strdup(yytext);return '*'; }
"/"    { yylval=(YYSTYPE);strdup(yytext);return '/'; }
"^"    { yylval=(YYSTYPE);strdup(yytext);return '^'; }
"%"    { yylval=(YYSTYPE);strdup(yytext);return '%'; }
">"    { yylval=(YYSTYPE);strdup(yytext);return '>'; }
"<"    { yylval=(YYSTYPE);strdup(yytext);return '<'; }
"\#"    { yylval=(YYSTYPE);strdup(yytext);return '\#'; }
"break"    { yylval=(YYSTYPE);strdup(yytext);return BREAK; }
"case"    { yylval=(YYSTYPE);strdup(yytext);return CASE; }
"char"    { yylval=(YYSTYPE);strdup(yytext);return CHAR; }
"const"    { yylval=(YYSTYPE);strdup(yytext);return CONST; }
"else"    { yylval=(YYSTYPE);strdup(yytext);return ELSE; }
"float"    { yylval=(YYSTYPE);strdup(yytext);return FLOAT; }
"for"    { yylval=(YYSTYPE);strdup(yytext);return FOR; }
"if"    { yylval=(YYSTYPE);strdup(yytext);return IF; }
"int"    { yylval=(YYSTYPE);strdup(yytext);return INT; }
"\return"{ yylval=(YYSTYPE);strdup(yytext);return RETURN; }
"struct"{ yylval=(YYSTYPE);strdup(yytext);return STRUCT; }
"switch"{ yylval=(YYSTYPE);strdup(yytext);return SWITCH; }
"void"    { yylval=(YYSTYPE);strdup(yytext);return VOID; }
"while"    { yylval=(YYSTYPE);strdup(yytext);return WHILE; }
"include"{ yylval=(YYSTYPE);strdup(yytext);return INCLUDE; }
"NULL"    { yylval=(YYSTYPE);strdup(yytext);return INTEGER; }
"0"[xX][0-9a-fA-F]{ yylval=(YYSTYPE);strdup(yytext)=yytext;return INTEGER; }
"0"[0-7]{ yylval=(YYSTYPE);strdup(yytext)=yytext;return INTEGER; }
[0-9]+    { yylval=(YYSTYPE);strdup(yytext)=yytext;return INTEGER; }
{var}    { yylval=(YYSTYPE);strdup(yytext);return VAR; }
{op}    { yylval=(YYSTYPE);strdup(yytext);return OP; }
{ponct}    { yylval=(YYSTYPE);strdup(yytext);return PONCT; }
{expr}    { yylval=(YYSTYPE);strdup(yytext);return EXPR; }
{type}    { yylval=(YYSTYPE);strdup(yytext);return TYPE; }
%%
main (){
yylex();
}

7 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 mai 2009 à 17:06
Voila. Tes erreurs:
- On ne colle pas un { a côté d'une règle, Flex aime pas ça.
- On évite d'utiliser | pour des caractères, les [ ] sont plus adaptés
- J'ai dégager l'expression rationnelle "type" puisqu'elle ne pouvait jamais être "matché". En effet, tu demandes à matcher "int", "float" et "char", puis à matcher l'une des trois règles. Il faut te mettre d'accord. Soit tu matches "int", "float", "char" séparément, soit tu les match ensemble sous la règle "type", mais pas les deux. Sinon, il y a conflit.
- La signature d'un main est int main() et non main() tout court.
- "return" et pas "\return"

Chez moi, ça fonctionne:

%{
#include "monyacc.tab.h"
#include <stdio.h>
#include <string.h>
extern YYSTYPE yylval;
FILE * fichier;
%}

chars [A-Za-z]
numbers [0-9]+
var [A-Za-z0-9]+
op [+*/%^&|!=<>-]
ponct [{}();:?.#[]]
expr ({var}|{op}|{ponct})+
type "int"|"char"|"float"

%%
"{"    { yylval=(YYSTYPE);strdup(yytext);return '{'; }
"}"    { yylval=(YYSTYPE);strdup(yytext);return '}'; }
"["    { yylval=(YYSTYPE);strdup(yytext);return '['; }
"]"    { yylval=(YYSTYPE);strdup(yytext);return ']'; }
"("    { yylval=(YYSTYPE);strdup(yytext);return '('; }
")"    { yylval=(YYSTYPE);strdup(yytext);return ')'; }
";"    { yylval=(YYSTYPE);strdup(yytext);return ';'; }
","    { yylval=(YYSTYPE);strdup(yytext);return ','; }
":"    { yylval=(YYSTYPE);strdup(yytext);return ':'; }
"."    { yylval=(YYSTYPE);strdup(yytext);return '.'; }
"|"    { yylval=(YYSTYPE);strdup(yytext);return '|'; }
"!"    { yylval=(YYSTYPE);strdup(yytext);return '!'; }
"?"    { yylval=(YYSTYPE);strdup(yytext);return '?'; }
"&"    { yylval=(YYSTYPE);strdup(yytext);return '&'; }
"+"    { yylval=(YYSTYPE);strdup(yytext);return '+'; }
"-"    { yylval=(YYSTYPE);strdup(yytext);return '-'; }
"*"    { yylval=(YYSTYPE);strdup(yytext);return '*'; }
"/"    { yylval=(YYSTYPE);strdup(yytext);return '/'; }
"^"    { yylval=(YYSTYPE);strdup(yytext);return '^'; }
"%"    { yylval=(YYSTYPE);strdup(yytext);return '%'; }
">"    { yylval=(YYSTYPE);strdup(yytext);return '>'; }
"<"    { yylval=(YYSTYPE);strdup(yytext);return '<'; }
"\#"    { yylval=(YYSTYPE);strdup(yytext);return '\#'; }
"break"    { yylval=(YYSTYPE);strdup(yytext);return BREAK; }
"case"    { yylval=(YYSTYPE);strdup(yytext);return CASE; }
"char"    { yylval=(YYSTYPE);strdup(yytext);return CHAR; }
"const"    { yylval=(YYSTYPE);strdup(yytext);return CONST; }
"else"    { yylval=(YYSTYPE);strdup(yytext);return ELSE; }
"float"    { yylval=(YYSTYPE);strdup(yytext);return FLOAT; }
"for"    { yylval=(YYSTYPE);strdup(yytext);return FOR; }
"if"    { yylval=(YYSTYPE);strdup(yytext);return IF; }
"int"    { yylval=(YYSTYPE);strdup(yytext);return INT; }
"return" { yylval=(YYSTYPE);strdup(yytext);return RETURN; }
"struct" { yylval=(YYSTYPE);strdup(yytext);return STRUCT; }
"switch" { yylval=(YYSTYPE);strdup(yytext);return SWITCH; }
"void"    { yylval=(YYSTYPE);strdup(yytext);return VOID; }
"while"    { yylval=(YYSTYPE);strdup(yytext);return WHILE; }
"include" { yylval=(YYSTYPE);strdup(yytext);return INCLUDE; }
"NULL"    { yylval=(YYSTYPE);strdup(yytext);return INTEGER; }
"0"[xX][0-9a-fA-F] { yylval=(YYSTYPE);strdup(yytext)=yytext;return INTEGER; }
"0"[0-7] { yylval=(YYSTYPE);strdup(yytext)=yytext;return INTEGER; }
[0-9]+    { yylval=(YYSTYPE);strdup(yytext)=yytext;return INTEGER; }
{var}    { yylval=(YYSTYPE);strdup(yytext);return VAR; }
{op}    { yylval=(YYSTYPE);strdup(yytext);return OP; }
{ponct}    { yylval=(YYSTYPE);strdup(yytext);return PONCT; }
{expr}    { yylval=(YYSTYPE);strdup(yytext);return EXPR; }

%%

int main ()
{
  yylex();
}
3
jihado86 Messages postés 13 Date d'inscription samedi 25 avril 2009 Statut Membre Dernière intervention 28 mai 2009
20 mai 2009 à 17:13
Vraiment merci merci merci
je trouve pas un mot pour vous remercier
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 mai 2009 à 17:16
Aucun problème, mais si la réponse te satisfait, valide là.
0
jihado86 Messages postés 13 Date d'inscription samedi 25 avril 2009 Statut Membre Dernière intervention 28 mai 2009
20 mai 2009 à 17:20
si la validation se fait par l'appui sur le bouton réponse acceptée alors je l'ai fait
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 mai 2009 à 17:22
Au temps pour moi, je n'avais pas rafraîchit le cache de mon navigateur.
0
jihado86 Messages postés 13 Date d'inscription samedi 25 avril 2009 Statut Membre Dernière intervention 28 mai 2009
20 mai 2009 à 17:36
pouvez vous me dire comment générer les fichiers y.tab.h et y.tab.c à partir de Yacc?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 mai 2009 à 17:38
La question n'est plus la même, ouvre un nouveau sujet.
Une seule question distincte par fil de discussion.
Merci.
0
Rejoignez-nous