Ou sont les erreurs de ce code? [Résolu]

Signaler
Messages postés
13
Date d'inscription
samedi 25 avril 2009
Statut
Membre
Dernière intervention
28 mai 2009
-
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
-
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

Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
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();
}
Messages postés
13
Date d'inscription
samedi 25 avril 2009
Statut
Membre
Dernière intervention
28 mai 2009

Vraiment merci merci merci
je trouve pas un mot pour vous remercier
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Aucun problème, mais si la réponse te satisfait, valide là.
Messages postés
13
Date d'inscription
samedi 25 avril 2009
Statut
Membre
Dernière intervention
28 mai 2009

si la validation se fait par l'appui sur le bouton réponse acceptée alors je l'ai fait
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Au temps pour moi, je n'avais pas rafraîchit le cache de mon navigateur.
Messages postés
13
Date d'inscription
samedi 25 avril 2009
Statut
Membre
Dernière intervention
28 mai 2009

pouvez vous me dire comment générer les fichiers y.tab.h et y.tab.c à partir de Yacc?
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
La question n'est plus la même, ouvre un nouveau sujet.
Une seule question distincte par fil de discussion.
Merci.