A voir également:
- ERREUR programmation FLEX\BISON
- Erreur 0x80070643 - Accueil - Windows
- Chrome os flex - Guide
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Application de programmation - Guide
- Erreur 1001 outlook - Accueil - Bureautique
2 réponses
flugin
Messages postés
153
Date d'inscription
mardi 7 avril 2009
Statut
Membre
Dernière intervention
17 mai 2011
15
26 janv. 2011 à 18:49
26 janv. 2011 à 18:49
C'est quoi "bison" ? =s
voila mes fichier .l et .y !!
bison:
%{
#include <stdlib.h>
%}
%start PGME
%token CODE
%token START
%token IDF
%token END
%token INT
%token REAL
%token BOOLEAN
%token CHAR
%token STRING
%token CONST
%token WHILE
%token EXECUTE
%token WHENE
%token DO
%token OTHERWISE
%token AFFECT
%token EGAL
%token DIFF
%token PONITVERGULE
%token VERGULE
%token POINT
%token CONSTE
%token CONSTES
%token CONSTR
%token CONSTRS
%token COMS
%token SOM
%token SOUS
%token MUL
%token DIV
%%
PGME:CODE IDF partie_principal ;
partie_principal:partie_declaration START partie_inst END POINT ;
partie_declaration:type IDF B A;
B:C IDF B|?;
c:VERGULE
type:INT|BOOLEAN|CHAR|STRING|REAL ;
partie_declaration:type IDF A|CONST IDF = constante PONITVERGULE|? ;
constante :CONSTE|CONSTES|CONSTR|CONSTRS ;
partie_inst: IDF AFFECT expression A|WHENE cond EXECUTE inst A|WHENE cond DO parti_inst OTHERWISE partie_inst|? ;
expression :IDF|IDF SOM IDF|IDF SOUS IDF|IDF MUL IDF|IDF DIV IDF ;
A :PONITVERGULE ;
cond:IDF EGAL IDF|IDF DIFF IDF|IDF EGAL contante|IDF DIFF constante ;
inst:partie_inst ;
%%
int main ( int argc, char** argv ) {
yyparse ();
}
flex:
%{
include "bison.tab.h"
%}
lettre [a-zA-Z]
chiffre [0-9]
IDF (({lettre}+)({lettre}*|{chiffre}*|(-?))({lettre}+|{chiffre}+))
constE ({chiffre}+)
constEsignee [\+|\-]{constE}
constR {chiffre}+.?{chiffre}+
constRsignee [\+|\-]{constR}
coms $[.]$
%%
"INT" return (INT);
"REAL" return (REAL)
"BOOLEAN" return (BOOLEAN)
"STRING" return (STRING)
"CHAR" return (CHAR)
";" return(POINTVERGULE);
"," return(VERGULE");
"=" return ("EGAL");
"<>" return ("DIFF");
":=" return(AFFECT);
"." return (POINT);
"CODE" return(CODE);
"START" return(START);
"END" return(END);
"CONST" return (CONST);
"WHILE" return (WHILE);
"EXECUTE" return (EXECUTE);
"WHENE" return (WHENE);
"DO" return (DO);
"OTHERWISE" return (OTHERWISE);
{coms} return (COMS);
"+" return (SOM);
"-" return (SOUS);
"*" return (MUL);
"/" return (DIV);
{lettre} return (IDF) ;
{lettre}- {printf("erreur :un idf ne se termine pas par -");}
{IDF} if (yyleng>20) {printf("erreur:IDF trop long");} else return (IDF) ;
{IDF}- {printf("erreur :un idf ne se termine pas par -");}
{constE} if (yyleng>6) {printf("erreur:constanteE trop long");} else return (CONSTE);
{constEsignee} if (yyleng>6) { printf("erreur:constanteE trop long");} else return (CONSTES);
{constR} if (yyleng>12) {printf("erreur:constanteR trop long");}else return (CONSTR);
{constRsignee} if (yyleng>12) {printf("erreur:constanteE trop long");} else return (CONSTRS);
%%
int
main(void)
{
yylex();
}
svp a l'aide !!
bison:
%{
#include <stdlib.h>
%}
%start PGME
%token CODE
%token START
%token IDF
%token END
%token INT
%token REAL
%token BOOLEAN
%token CHAR
%token STRING
%token CONST
%token WHILE
%token EXECUTE
%token WHENE
%token DO
%token OTHERWISE
%token AFFECT
%token EGAL
%token DIFF
%token PONITVERGULE
%token VERGULE
%token POINT
%token CONSTE
%token CONSTES
%token CONSTR
%token CONSTRS
%token COMS
%token SOM
%token SOUS
%token MUL
%token DIV
%%
PGME:CODE IDF partie_principal ;
partie_principal:partie_declaration START partie_inst END POINT ;
partie_declaration:type IDF B A;
B:C IDF B|?;
c:VERGULE
type:INT|BOOLEAN|CHAR|STRING|REAL ;
partie_declaration:type IDF A|CONST IDF = constante PONITVERGULE|? ;
constante :CONSTE|CONSTES|CONSTR|CONSTRS ;
partie_inst: IDF AFFECT expression A|WHENE cond EXECUTE inst A|WHENE cond DO parti_inst OTHERWISE partie_inst|? ;
expression :IDF|IDF SOM IDF|IDF SOUS IDF|IDF MUL IDF|IDF DIV IDF ;
A :PONITVERGULE ;
cond:IDF EGAL IDF|IDF DIFF IDF|IDF EGAL contante|IDF DIFF constante ;
inst:partie_inst ;
%%
int main ( int argc, char** argv ) {
yyparse ();
}
flex:
%{
include "bison.tab.h"
%}
lettre [a-zA-Z]
chiffre [0-9]
IDF (({lettre}+)({lettre}*|{chiffre}*|(-?))({lettre}+|{chiffre}+))
constE ({chiffre}+)
constEsignee [\+|\-]{constE}
constR {chiffre}+.?{chiffre}+
constRsignee [\+|\-]{constR}
coms $[.]$
%%
"INT" return (INT);
"REAL" return (REAL)
"BOOLEAN" return (BOOLEAN)
"STRING" return (STRING)
"CHAR" return (CHAR)
";" return(POINTVERGULE);
"," return(VERGULE");
"=" return ("EGAL");
"<>" return ("DIFF");
":=" return(AFFECT);
"." return (POINT);
"CODE" return(CODE);
"START" return(START);
"END" return(END);
"CONST" return (CONST);
"WHILE" return (WHILE);
"EXECUTE" return (EXECUTE);
"WHENE" return (WHENE);
"DO" return (DO);
"OTHERWISE" return (OTHERWISE);
{coms} return (COMS);
"+" return (SOM);
"-" return (SOUS);
"*" return (MUL);
"/" return (DIV);
{lettre} return (IDF) ;
{lettre}- {printf("erreur :un idf ne se termine pas par -");}
{IDF} if (yyleng>20) {printf("erreur:IDF trop long");} else return (IDF) ;
{IDF}- {printf("erreur :un idf ne se termine pas par -");}
{constE} if (yyleng>6) {printf("erreur:constanteE trop long");} else return (CONSTE);
{constEsignee} if (yyleng>6) { printf("erreur:constanteE trop long");} else return (CONSTES);
{constR} if (yyleng>12) {printf("erreur:constanteR trop long");}else return (CONSTR);
{constRsignee} if (yyleng>12) {printf("erreur:constanteE trop long");} else return (CONSTRS);
%%
int
main(void)
{
yylex();
}
svp a l'aide !!