| | Lex & Yacc+ Exemple Fichier | |
| | Auteur | Message |
---|
Kévin G. Invité
| Sujet: Lex & Yacc+ Exemple Fichier Mer 4 Fév - 9:11 | |
| Exemple de fichier - Code:
-
XD x4 : [3 .. 5] x1,x2 : {5,2,3} U {5,2,3} x3 : {4,2,1,3} U [0 .. 2] C x1 = (3+x4/2) TAN(SQRT(x1)) != COS(x2) + SIN(x3) x1 = 3 ALLDIFF(x1, x2, x4) ((x1 = TRUE) && (x2 = FALSE)) || (x1 = FALSE) - Lex:
%{ #include "y.tab.h" int num_ligne = 0; %}
%%
"," {fprintf(stderr, "VIRGULE "); return(VIRGULE);} "->" {fprintf(stderr, "FLECHE "); return(FLECHE);} ".." {fprintf(stderr, "POINT_POINT "); return(POINT_POINT);} "." {fprintf(stderr, "POINT "); return(POINT);} ":" {fprintf(stderr, "DEUX_POINTS "); return(DEUX_POINTS);} ";" {fprintf(stderr, "POINT_VIRGULE "); return(POINT_VIRGULE);} "(" {fprintf(stderr, "PO "); return(PO);} ")" {fprintf(stderr, "PF "); return(PF);} "[" {fprintf(stderr, "CO "); return(CO);} "]" {fprintf(stderr, "CF "); return(CF);} "{" {fprintf(stderr, "AO "); return(AO);} "}" {fprintf(stderr, "AF "); return(AF);} "+" {fprintf(stderr, "PLUS "); return(PLUS);} "-" {fprintf(stderr, "MOINS "); return(MOINS);} "*" {fprintf(stderr, "MULTIPLIE_PAR "); return(MULTIPLIE_PAR);} "/" {fprintf(stderr, "DIVISE_PAR "); return(DIVISE_PAR);} "%" {fprintf(stderr, "MODULO "); return(MODULO);} "=" {fprintf(stderr, "EGAL "); return(EGAL);} "!=" {fprintf(stderr, "DIFFERENT "); return(DIFFERENT);} ">=" {fprintf(stderr, "SUPERIEUR_OU_EGAL "); return(SUPERIEUR_OU_EGAL);} "<=" {fprintf(stderr, "INFERIEUR_OU_EGAL "); return(INFERIEUR_OU_EGAL);} ">" {fprintf(stderr, "SUPERIEUR "); return(SUPERIEUR);} "<" {fprintf(stderr, "INFERIEUR "); return(INFERIEUR);} "&&" {fprintf(stderr, "ET "); return(ET);} "||" {fprintf(stderr, "OU "); return(OU);} "!" {fprintf(stderr, "NON "); return(NON);}
"XD" {fprintf(stderr, "XD "); return(XD);} "C" {fprintf(stderr, "C "); return(C);} "U" {fprintf(stderr, "UNION "); return(UNION);} "ALLDIFF" {fprintf(stderr, "ALLDIFF "); return(ALLDIFF);} "SQRT" {fprintf(stderr, "SQRT "); return(SQRT);} "SIN" {fprintf(stderr, "SIN "); return(SIN);} "COS" {fprintf(stderr, "COS "); return(COS);} "TAN" {fprintf(stderr, "TAN "); return(TAN);}
0|[1-9][0-9]* { // yylval.u_entier = atoi(yytext); fprintf(stderr, "ENTIER "); return(ENTIER); }
0|[0-9]+[.][0-9]* { // yylval.u_reel = atof(yytext); fprintf(stderr, "REEL "); return(REEL); }
"TRUE"|"FALSE" { // if (strcmp("true", yytext)) yylval.u_booleen = 1; // else yylval.u_booleen = 0; fprintf(stderr, "BOOLEEN "); return(BOOLEEN); }
[a-z][a-z\_]*[0-9\_]* { fprintf(stderr, "IDF "); return(IDF); }
[\n] fprintf(stderr, "\n<%d> ", ++num_ligne); [\t] ; " " ; . { fprintf(stderr, "ERREUR "); return(ERREUR); }
%%
- Yacc:
%{ #include <stdio.h> %}
%token XD C %token VIRGULE POINT FLECHE DEUX_POINTS POINT_VIRGULE POINT_POINT %token PO PF CO CF AO AF %token UNION ALLDIFF %token PLUS MOINS MULTIPLIE_PAR DIVISE_PAR MODULO %token ET OU NON EGAL DIFFERENT SUPERIEUR_OU_EGAL INFERIEUR_OU_EGAL SUPERIEUR INFERIEUR %token ENTIER REEL BOOLEEN %token SQRT SIN COS TAN %token IDF ERREUR
%% programme: XD liste_var_dom C liste_contraintes ;
liste_var_dom: var_dom liste_var_dom | var_dom ;
liste_contraintes: contrainte liste_contraintes | contrainte ;
var_dom: liste_variables DEUX_POINTS union_domaine ;
liste_variables: IDF VIRGULE liste_variables | IDF ;
union_domaine: domaine UNION union_domaine | domaine ;
domaine: AO liste_entiers AF | intervalle ;
liste_entiers: nombre VIRGULE liste_entiers | nombre ;
intervalle: CO nombre POINT_POINT nombre CF ;
nombre: ENTIER | REEL | BOOLEEN ;
contrainte: expression | ALLDIFF PO liste_variables PF ;
expression: expression1 | MOINS expression1 | NON PO expression1 PF ;
expression1: expression1 EGAL expression2 | expression1 DIFFERENT expression2 | expression1 SUPERIEUR_OU_EGAL expression2 | expression1 INFERIEUR_OU_EGAL expression2 | expression1 SUPERIEUR expression2 | expression1 INFERIEUR expression2 | expression1 PLUS expression2 | expression1 MOINS expression2 | expression1 OU expression2 | expression1 ET expression2 | expression2 ;
expression2: expression2 MULTIPLIE_PAR expression3 | expression2 DIVISE_PAR expression3 | expression2 MODULO expression3 | expression3 ;
expression3: PO expression PF | nombre | IDF | fonction ;
fonction: SQRT PO expression PF | SIN PO expression PF | COS PO expression PF | TAN PO expression PF ;
%% int yyerror() { fprintf(stderr,"\e[31mErreur de syntaxe\e[31m\n") ; }
|
| | | Léo G
Messages : 12 Date d'inscription : 04/02/2015
| Sujet: Re: Lex & Yacc+ Exemple Fichier Sam 7 Fév - 12:31 | |
| correction pour yacc: l'ordre de priorité des expression algébrique était anarchique. je l'ai changé pour reflété un sous ensemble des priorités du langage C. correction pour lex: met la detection de réel avant celle d'entier dans le fichier car le début d'un réel peut être un entier, et il serai considéré en entier ce qui n'est pas voulu correction pour lex et yacc: supprime de lex et yacc des token inutiles: -FLECHE -POINT -POINT_VIRGULE - lex.l:
%{ #include "y.tab.h" int num_ligne = 0; %}
%%
"," {fprintf(stderr, "VIRGULE "); return(VIRGULE);} ".." {fprintf(stderr, "POINT_POINT "); return(POINT_POINT);} ":" {fprintf(stderr, "DEUX_POINTS "); return(DEUX_POINTS);} "(" {fprintf(stderr, "PO "); return(PO);} ")" {fprintf(stderr, "PF "); return(PF);} "[" {fprintf(stderr, "CO "); return(CO);} "]" {fprintf(stderr, "CF "); return(CF);} "{" {fprintf(stderr, "AO "); return(AO);} "}" {fprintf(stderr, "AF "); return(AF);} "+" {fprintf(stderr, "PLUS "); return(PLUS);} "-" {fprintf(stderr, "MOINS "); return(MOINS);} "*" {fprintf(stderr, "MULTIPLIE_PAR "); return(MULTIPLIE_PAR);} "/" {fprintf(stderr, "DIVISE_PAR "); return(DIVISE_PAR);} "%" {fprintf(stderr, "MODULO "); return(MODULO);} "=" {fprintf(stderr, "EGAL "); return(EGAL);} "!=" {fprintf(stderr, "DIFFERENT "); return(DIFFERENT);} ">=" {fprintf(stderr, "SUPERIEUR_OU_EGAL "); return(SUPERIEUR_OU_EGAL);} "<=" {fprintf(stderr, "INFERIEUR_OU_EGAL "); return(INFERIEUR_OU_EGAL);} ">" {fprintf(stderr, "SUPERIEUR "); return(SUPERIEUR);} "<" {fprintf(stderr, "INFERIEUR "); return(INFERIEUR);} "&&" {fprintf(stderr, "ET "); return(ET);} "||" {fprintf(stderr, "OU "); return(OU);} "!" {fprintf(stderr, "NON "); return(NON);}
"XD" {fprintf(stderr, "XD "); return(XD);} "C" {fprintf(stderr, "C "); return(C);} "U" {fprintf(stderr, "UNION "); return(UNION);} "ALLDIFF" {fprintf(stderr, "ALLDIFF "); return(ALLDIFF);} "SQRT" {fprintf(stderr, "SQRT "); return(SQRT);} "SIN" {fprintf(stderr, "SIN "); return(SIN);} "COS" {fprintf(stderr, "COS "); return(COS);} "TAN" {fprintf(stderr, "TAN "); return(TAN);}
0|[0-9]+[.][0-9]* { // yylval.u_reel = atof(yytext); fprintf(stderr, "REEL "); return(REEL); }
0|[1-9][0-9]* { // yylval.u_entier = atoi(yytext); fprintf(stderr, "ENTIER "); return(ENTIER); }
"TRUE"|"FALSE" { // if (strcmp("true", yytext)) yylval.u_booleen = 1; // else yylval.u_booleen = 0; fprintf(stderr, "BOOLEEN "); return(BOOLEEN); }
[a-z][a-z\_]*[0-9\_]* { fprintf(stderr, "IDF "); return(IDF); }
[\n] fprintf(stderr, "\n<%d> ", ++num_ligne); [\t] ; " " ; . { fprintf(stderr, "ERREUR "); return(ERREUR); }
%%
- yacc.y:
%{ #include <stdio.h> %}
%token XD C %token VIRGULE DEUX_POINTS POINT_POINT %token PO PF CO CF AO AF %token UNION ALLDIFF %token PLUS MOINS MULTIPLIE_PAR DIVISE_PAR MODULO %token ET OU NON EGAL DIFFERENT SUPERIEUR_OU_EGAL INFERIEUR_OU_EGAL SUPERIEUR INFERIEUR %token ENTIER REEL BOOLEEN %token SQRT SIN COS TAN %token IDF ERREUR
%% programme: XD liste_var_dom C liste_contraintes ;
liste_var_dom: var_dom liste_var_dom | var_dom ;
liste_contraintes: contrainte liste_contraintes | contrainte ;
var_dom: liste_variables DEUX_POINTS union_domaine ;
liste_variables: IDF VIRGULE liste_variables | IDF ;
union_domaine: domaine UNION union_domaine | domaine ;
domaine: AO liste_entiers AF | intervalle ;
liste_entiers: nombre VIRGULE liste_entiers | nombre ;
intervalle: CO nombre POINT_POINT nombre CF ;
nombre: ENTIER | REEL | BOOLEEN ;
contrainte: expression | ALLDIFF PO liste_variables PF ;
expression: expression1 | expression OU expression1 ;
expression1: expression2 | expression1 ET expression2 ;
expression2: expression3 | expression2 EGAL expression3 | expression2 DIFFERENT expression3 ;
expression3: expression4 | expression3 SUPERIEUR_OU_EGAL expression4 | expression3 INFERIEUR_OU_EGAL expression4 | expression3 SUPERIEUR expression4 | expression3 INFERIEUR expression4 ;
expression4: expression5 | expression4 PLUS expression5 | expression4 MOINS expression5 ;
expression5: expression6 | expression5 MULTIPLIE_PAR expression6 | expression5 DIVISE_PAR expression6 | expression5 MODULO expression6 ;
expression6: expression7 | NON PO expression PF ;
expression7: PO expression PF | nombre | IDF | fonction ;
fonction: SQRT PO expression4 PF | SIN PO expression4 PF | COS PO expression4 PF | TAN PO expression4 PF ;
%% int yyerror() { fprintf(stderr,"\e[31mErreur de syntaxe\e[31m\n") ; }
| |
| | | | Lex & Yacc+ Exemple Fichier | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |