[PDF] [PDF] Générer un analyseur avec Flex&Bison - ENIB

Générer un analyseur avec Flex&Bison Généralités Analyse lexicale avec Flex Analyse syntaxique avec Bison Association de Flex et Bison Fabrice Harrouet



Previous PDF Next PDF





[PDF] Générer un analyseur avec Flex&Bison - ENIB

Générer un analyseur avec Flex&Bison Généralités Analyse lexicale avec Flex Analyse syntaxique avec Bison Association de Flex et Bison Fabrice Harrouet



[PDF] Chapitre 6 : Outil danalyse lexicale : Flex - Pr ABDELMAJID

Description de Flex Quelques exemples simples Format d'un fichier Flex Prof Abdelmajid Dargham Chapitre 6 : Analyse lexicale avec Flex 



[PDF] Analyse lexicale

Outils automatiques: Flex Révision hiver 2018 p 7 Interface avec l'analyseur lexical entrée analyseur lexical (Lien avec l'horizon de l'analyseur lexical )



[PDF] L3 Informatique Compilation TP01 - ANALYSE LEXICALE 1 Objectif

L'objectif de ce TP est de programmer un analyseur lexical pour le langage L symboles h avec flex, vous pouvez inclure symboles h dans votre fichier flex



[PDF] Thème 1 Analyse Lexicale, Analyse Syntaxique - Laure Gonnord

1 1 Un peu de cours 1 1 1 Analyse Lexicale avec flex Le but de l'analyse lexicale est de transformer une suite de symboles en terminaux (un terminal peut être



[PDF] lex et yacc

lexicales, afin qu'elles puissent être partagées par l'analyseur syntaxique et l' analyseur lexical $ flex calc l produit le fichier : lex yy c qui contient le code en c de 



[PDF] Travaux Pratiques Compilation no1 - IGM

Compiler l'analyseur lexical avec flex tp1-ex1 l, ceci engendre un fichier lex yy c — Compiler le fichier C obtenu avec gcc, puis tester l'exécutable a out obtenu



[PDF] Chapitre 1 Construction dun analyseur lexical : scanner - Free

Après l'analyse syntaxique, on récupère un ensemble de tokens Il s'agit de voir Type 1, grammaire context sensitive avec des règles de type uAv → uwv Reconnu Comment spécifier les tokens lorsqu'on les définit dans flex ? L'idée est 



[PDF] Introduction à la compilation - Département dinformatique de l

La configuration de flex est décrite dans un fichier texte (extensions l ou lex) ➢ Flex traduit L'analyseur lexical le plus court recopie le flot d'entrée sur le flot de sortie : Cours de l'analyse reprend avec les autres expressions rationnelles

[PDF] flex et bison pdf

[PDF] analyseur syntaxique avec flex et bison

[PDF] exercice flex avec correction

[PDF] lex yacc exemple

[PDF] allocution bienvenue association

[PDF] fin de la démocratie athénienne

[PDF] l'apogée d'athènes

[PDF] fondation d'athènes

[PDF] apogée d'athènes date

[PDF] auteurs francophones connus

[PDF] liste des auteurs africains et leurs oeuvres pdf

[PDF] auteurs francophones contemporains

[PDF] littérature francophone est elle une littérature française

[PDF] auteurs francophones africains

[PDF] littérature francophone définition

[PDF] Générer un analyseur avec Flex&Bison - ENIB %Techniques de compilation enib, F.H ... 1/44Generer un analyseur avecFlex&Bison

Generalites

Analyse lexicale avecFlex

Analyse syntaxique avecBison

Association deFlexetBisonFabriceHarrouet

Ecole Nationale d'Ingenieurs de Brest

harrouet@enib.fr http://www.enib.fr/~harrouet/ %Flex&Bisonenib, F.H ... 2/44Origine des outils.Lex&Yacc

Generateurs d'analyseurs lexicaux/syntaxiques enC

'annees 1970, laboratoiresBell

OutilsUNIX(Posix) standards

+ de nombreuses variantes (commerciales ou non) .Flex&Bison

VersionGNUdeLex&Yacc

Flex:\fastLex"Bison: jeu de mot surYacc

Beaucoup de possibilites supplementaires !

Disponible pour un tres grand nombre de plateformes .9de nombreux outils dierents ayant le m^eme propos

AntLR,Spirit...

On retrouve des choses issues deLex&Yacc

%Flex&Bisonenib, F.H ... 3/44Principe des outils .Lex/Flex:LEXical analyzer

Reconnaisseur de langages reguliers

Expressions rationnelles!codeCd'un analyseur lexical

Permet de reconna^tre lesmotsd'un langage

.Yacc/Bison:Yet Another Compiler Compiler

Reconnaisseur de langages non contextuels

Grammaire non contextuelle!codeCd'un analyseur syntaxique

Permet de reconna^tre lesphrasesd'un langage

%Flex&Bisonenib, F.H ... 4/44Principe des outilsBisonCompilation et

édition de liens

Fichier Flex

Fichier BisonFichier C

Fichier C

Fichiers CExécutable

Flex.Generation d'analyseurs statiques et non dynamiques Le codeCproduit est specique au langage a reconnaitre!ecacite Compilation du code genere comme le reste de l'application Modif du langage!regeneration du code des analyseurs %A. lexicale enFlexenib, F.H ... 5/44Structure d'un programmeFlex%{ %}Pré-code C

Définitions et options

Règles de production

Post-code CFichier FlexFichier C généré

Déclarations, macros

Tables d"analyse

Copie du pré-code C

Copie du post-code Cint yylex(void)

Copie du code C

Autres fonctions ....Pre/post-codeC:duCtout a fait classique .Options :%quelquechosepour parametrer le fonctionnement .Denitions :Expressions rationnelles auxquelles on attribue un nom .Regles de production :AssociationsER!codeCa executer %A. lexicale enFlexenib, F.H ... 6/44Expressions rationnelles enFlex.Comprend lesER POSIX

Voir le cours correspondant

.Quelques possibilites supplementaires

Unatomepeut ^etre une cha^neClitterale

ex :"ab"f3g !ababab

Les caracteres speciaux duCsont reconnus

ex :Hello\tWorld,Hello\123World,Hello\x2aWorld La notationf gpermet aussi de reutiliser uneERnommee ex :(fintegerg|frealg)?(integeretrealdenies avant)

L'atome<>represente la n de chier

Lesstart-conditions(voir plus loin)

%A. lexicale enFlexenib, F.H ... 7/44SyntaxeFlex.Denition desERnommees Un nomcolle a gauche, une ou plusieurs espaces, uneER ex :integer [1-9][0-9]*|0 ex :indent [a-zA-Z][0-9a-zA-Z]* .Regles de production UneERcollee a gauche, une ou plusieurs espaces, du codeC Code sur une seule ligne ou bloc avecfsur la m^eme ligne que l'ER ex :fintegergcerr << "INTEGER" << endl; ex :findentg f cerr << "IDENT" << endl; g Les commentairesne doivent pas^etre colles a gauche (!ER!) %A. lexicale enFlexenib, F.H ... 8/44L'analyseur genere.La fonctionint yylex(void)

Extrait des caracteres du

uxyyin(stdinpar defaut) Confronte les sequences auxERdes regles de production Test de haut en bas,la plus longuecorrespondance est retenue

Execute les actions semantiques (codeC) associees

Variableyytext: cha^ne de caracteres correspondant a l'ER

Variableyyleng: longueur deyytext

Ecrit lesnon-correspondancessuryyout(stdoutpar defaut) Jusqu'a la n de chier ou unreturndans les actionsC .La valeur de retour

0en cas de n de chier

Un code numerique (#define,enum) indiquant l'ERreconnue !Analyse lexicale %A. lexicale enFlexenib, F.H ... 9/44Compteur de lignes, mots et caracteres%{ int nbChar=0,nbWord=0,nbLine=0; $ %} $ flex -oprog.c prog.l $ gcc -oprog prog.c /* doesn't need yywrap() */ $ ./prog < prog.l %option noyywrap 24 39 347 endOfLine \n character [^ \t\n] {endOfLine} { ++nbChar; ++nbLine; } {character}+ { nbChar+=yyleng; ++nbWord; } . { ++nbChar; } int main(void) yylex(); return(0); %A. lexicale enFlexenib, F.H ... 10/44Un analyseur trivial%{ $ cat file.txt %} var1=123*45.67; %option noyywrap _attr+=var1; integer [0-9]+ $ ./prog < file.txt real [0-9]+\.[0-9]*|\.[0-9]+ IDENT [var1] ident [a-zA-Z_][0-9a-zA-Z_]* UNKNOWN [=] %% INTEGER [123] {real} { fprintf(stderr,"REAL [%s]\n",yytext); } UNKNOWN [*] {integer} { fprintf(stderr,"INTEGER [%s]\n",yytext); } REAL [45.67] {ident} { fprintf(stderr,"IDENT [%s]\n",yytext); } UNKNOWN [;] \n { fprintf(stderr,"NEW_LINE [%s]\n",yytext); } NEW_LINE [ . { fprintf(stderr,"UNKNOWN [%s]\n",yytext); } ] %% IDENT [_attr]

UNKNOWN [+]

int UNKNOWN [=] main(void) IDENT [var1] { UNKNOWN [;] yylex(); NEW_LINE [ return(0); ] %A. lexicale enFlexenib, F.H ... 11/44Un analyseur plus conventionnel | 1/2%{ $ cat file.txt #include var1=123*45.67; enum {INTEGER=1,REAL,IDENT,NEW_LINE,UNKNOWN}; _attr+=var1; char globalValue[0x100]; $ ./prog < file.txt %} IDENT [var1]

UNKNOWN [=]

%option noyywrap INTEGER [123]

UNKNOWN [*]

integer [0-9]+ REAL [45.67] real [0-9]+\.[0-9]*|\.[0-9]+ UNKNOWN [;] ident [a-zA-Z_][0-9a-zA-Z_]* NEW_LINE [ %% IDENT [_attr]

UNKNOWN [+]

{real} { strcpy(globalValue,yytext); return(REAL); } UNKNOWN [=] {integer} { strcpy(globalValue,yytext); return(INTEGER); } IDENT [var1] {ident} { strcpy(globalValue,yytext); return(IDENT); } UNKNOWN [;] \n { strcpy(globalValue,yytext); return(NEW_LINE); } NEW_LINE [ . { strcpy(globalValue,yytext); return(UNKNOWN); } ]

END_OF_FILE

%A. lexicale enFlexenib, F.H ... 12/44Un analyseur plus conventionnel | 2/2int main(void) int token; do token=yylex(); switch(token) case 0: fprintf(stderr,"END_OF_FILE\n"); break; case INTEGER: fprintf(stderr,"INTEGER [%s]\n",globalValue); break; case REAL: fprintf(stderr,"REAL [%s]\n",globalValue); break; case IDENT: fprintf(stderr,"IDENT [%s]\n",globalValue); break; case NEW_LINE: fprintf(stderr,"NEW_LINE [%s]\n",globalValue); break; case UNKNOWN: fprintf(stderr,"UNKNOWN [%s]\n",globalValue); break; } while(token); return(0); %A. lexicale enFlexenib, F.H ... 13/44Une calculette a pile | 1/2%{ $ cat calc.txt #include 1 2 + #include 4 * using namespace std; 5 10 - @/ enum {VALUE=1,PLUS,MINUS,MULT,DIV}; $ ./prog calc.txt double val; --> 1 %} --> 1 2 --> 3 %option noyywrap --> 3 4 --> 12 integer [0-9]+ --> 12 5 real [0-9]+\.[0-9]*|\.[0-9]+ --> 12 5 10 value {integer}|{real} --> 12 -5 lexical error: @ %% --> -2.4 {value} { sscanf(yytext,"%lf",&val); return(VALUE); } --> -2.4 "+" { return(PLUS); } $ "-" { return(MINUS); } "*" { return(MULT); } "/" { return(DIV); } [ \t\n]+ { /* nothing to be done */ } . { cerr << "lexical error: " << yytext << endl; } %A. lexicale enFlexenib, F.H ... 14/44Une calculette a pile | 2/2int main(int argc,char ** argv) vector s; int token; if(argc>1) yyin=fopen(argv[1],"r"); // check result !!! doquotesdbs_dbs2.pdfusesText_2