Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Intro to Lex and Yacc

Intro to Lex and Yacc

Avatar for Adrien Couque

Adrien Couque

August 22, 2011
Tweet

More Decks by Adrien Couque

Other Decks in Technology

Transcript

  1. PARSING • Objectif : traiter une chaîne de caractères et

    la convertir en une structure de données • Principe : Paris, Décembre 2011 String List<Token> Lexer ex : fourni par lex Structure Parser ex : fourni par yacc
  2. LEXER • Le but du lexer est de convertir une

    chaîne de caractères en une liste de tokens (jetons). • Exemple : 12*(2+a)<=x7 => [ ‘12’ , ’*’ , ’(‘ , ’2’ , ’+’ , ’a’ , ’)’ , ‘<=’ , ‘x7’ ] • Identification d’un token ? Regex Paris, Décembre 2011
  3. LEX %{ #include "global.h" #include "calc.h" #include <stdlib.h> %} blancs

    [ \t]+ chiffre [0-9] entier {chiffre}+ exposant [eE][+-]?{entier} reel {entier}("."{entier})?{exposant}? %% {blancs} { /* On ignore */ } {reel} { yylval=atof(yytext); return(NOMBRE); } "+" return(PLUS); "-" return(MOINS); "*" return(FOIS); "/" return(DIVISE); "^" return(PUISSANCE); "(" return(PARENTHESE_GAUCHE); ")" return(PARENTHESE_DROITE); "\n" return(FIN); Exemple : interprète d’expressions numériques Exemple d’utilisation : 22*(1+3) => [ NOMBRE , FOIS , PARENTHESE_GAUCHE , NOMBRE , PLUS , NOMBRE , PARENTHESE_DROITE ] Paris, Décembre 2011
  4. LEX %{ #include "global.h" #include "calc.h" #include <stdlib.h> %} blancs

    [ \t]+ chiffre [0-9] entier {chiffre}+ exposant [eE][+-]?{entier} reel {entier}("."{entier})?{exposant}? %% {blancs} { /* On ignore */ } {reel} { yylval=atof(yytext); return(NOMBRE); } "+" return(PLUS); "-" return(MOINS); "*" return(FOIS); "/" return(DIVISE); "^" return(PUISSANCE); "(" return(PARENTHESE_GAUCHE); ")" return(PARENTHESE_DROITE); "\n" return(FIN); Exemple : interprète d’expressions numériques Exemple d’utilisation : 22*(1+3) => [ NOMBRE , FOIS , PARENTHESE_GAUCHE , NOMBRE , PLUS , NOMBRE , PARENTHESE_DROITE ] Permet d’échapper du code en C Paris, Décembre 2011
  5. LEX %{ #include "global.h" #include "calc.h" #include <stdlib.h> %} blancs

    [ \t]+ chiffre [0-9] entier {chiffre}+ exposant [eE][+-]?{entier} reel {entier}("."{entier})?{exposant}? %% {blancs} { /* On ignore */ } {reel} { yylval=atof(yytext); return(NOMBRE); } "+" return(PLUS); "-" return(MOINS); "*" return(FOIS); "/" return(DIVISE); "^" return(PUISSANCE); "(" return(PARENTHESE_GAUCHE); ")" return(PARENTHESE_DROITE); "\n" return(FIN); Exemple : interprète d’expressions numériques Exemple d’utilisation : 22*(1+3) => [ NOMBRE , FOIS , PARENTHESE_GAUCHE , NOMBRE , PLUS , NOMBRE , PARENTHESE_DROITE ] Sépare les différentes sections (déclarations et productions) Paris, Décembre 2011
  6. LEX %{ #include "global.h" #include "calc.h" #include <stdlib.h> %} blancs

    [ \t]+ chiffre [0-9] entier {chiffre}+ exposant [eE][+-]?{entier} reel {entier}("."{entier})?{exposant}? %% {blancs} { /* On ignore */ } {reel} { yylval=atof(yytext); return(NOMBRE); } "+" return(PLUS); "-" return(MOINS); "*" return(FOIS); "/" return(DIVISE); "^" return(PUISSANCE); "(" return(PARENTHESE_GAUCHE); ")" return(PARENTHESE_DROITE); "\n" return(FIN); Exemple : interprète d’expressions numériques Exemple d’utilisation : 22*(1+3) => [ NOMBRE , FOIS , PARENTHESE_GAUCHE , NOMBRE , PLUS , NOMBRE , PARENTHESE_DROITE ] Déclarations Paris, Décembre 2011
  7. LEX %{ #include "global.h" #include "calc.h" #include <stdlib.h> %} blancs

    [ \t]+ chiffre [0-9] entier {chiffre}+ exposant [eE][+-]?{entier} reel {entier}("."{entier})?{exposant}? %% {blancs} { /* On ignore */ } {reel} { yylval=atof(yytext); return(NOMBRE); } "+" return(PLUS); "-" return(MOINS); "*" return(FOIS); "/" return(DIVISE); "^" return(PUISSANCE); "(" return(PARENTHESE_GAUCHE); ")" return(PARENTHESE_DROITE); "\n" return(FIN); Exemple : interprète d’expressions numériques Exemple d’utilisation : 22*(1+3) => [ NOMBRE , FOIS , PARENTHESE_GAUCHE , NOMBRE , PLUS , NOMBRE , PARENTHESE_DROITE ] Productions Paris, Décembre 2011
  8. PARSEURS • Principe : convertit liste de tokens en une

    structure (généralement un arbre) • Exemple : S S | | /|\ /|\ x + y * z ==> S * S ou S + S / \ / \ /|\ z x /|\ x + y y * z Paris, Décembre 2011
  9. AMBIGUITE • Que se passe-t-il en cas d’ambiguité ? •

    Exemple de grammaire : • AB => (AB) • ABA => (ABA) • B => (B) • Sur la chaîne ABAB, 2 possibilités : (AB)(AB) ou (ABA)(B) • Exemples plus courants : ‘for’ vs ‘foreach’, ‘<‘, ‘=’ vs ‘<=’ Paris, Décembre 2011
  10. YACC / BISON • Caractéristiques des parsers générés (LALR) :

    • LA : Look-ahead • L : Left to right • R : Rightmost deviation Paris, Décembre 2011
  11. LR • L : Left to right : ordre de

    lecture des tokens • R : Rightmost deviation (important en cas d’ambiguité, ex : a+a-a) Grammaire : Start : S (1) S -> S+S (2) S -> 1 (3) S -> a Leftmost : S -> S+S (1) -> 1+S (2) -> 1+S+S (1) -> 1+1+S (2) -> 1+1+a (3) Rightmost : S -> S+S (1) -> S+a (3) -> S+S+a (1) -> S+1+a (2) -> 1+1+a (2) 1 2 1 2 3 1 3 1 2 2
  12. EXEMPLE DE FONCTIONNEMENT Grammaire : (1) E -> E *

    B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 state action goto * + 0 1 $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Stack State Input Output Action [0] 0 1+1$ Paris, Décembre 2011
  13. EXEMPLE DE FONCTIONNEMENT Grammaire : (1) E -> E *

    B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 state action goto * + 0 1 $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Stack State Input Output Action [0] 0 1+1$ s2 Paris, Décembre 2011
  14. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ Paris, Décembre 2011
  15. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ Paris, Décembre 2011
  16. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 Paris, Décembre 2011
  17. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ Paris, Décembre 2011
  18. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ Paris, Décembre 2011
  19. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 Paris, Décembre 2011
  20. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 Paris, Décembre 2011
  21. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 Paris, Décembre 2011
  22. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 Paris, Décembre 2011
  23. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 Paris, Décembre 2011
  24. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 Paris, Décembre 2011
  25. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 Paris, Décembre 2011
  26. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 Paris, Décembre 2011
  27. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 r5 Paris, Décembre 2011
  28. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 r5 Paris, Décembre 2011
  29. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 r5 [0 , E , 3, ‘+’ , 6 , B , 8] 8 $ 5 3 5 Paris, Décembre 2011
  30. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 r5 [0 , E , 3, ‘+’ , 6 , B , 8] 8 $ 5 3 5 Paris, Décembre 2011
  31. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 r5 [0 , E , 3, ‘+’ , 6 , B , 8] 8 $ 5 3 5 r2 Paris, Décembre 2011
  32. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 r5 [0 , E , 3, ‘+’ , 6 , B , 8] 8 $ 5 3 5 r2 Paris, Décembre 2011
  33. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 r5 [0 , E , 3, ‘+’ , 6 , B , 8] 8 $ 5 3 5 r2 [0 , E , 3] 3 $ 5 3 5 2 Paris, Décembre 2011
  34. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 r5 [0 , E , 3, ‘+’ , 6 , B , 8] 8 $ 5 3 5 r2 [0 , E , 3] 3 $ 5 3 5 2 Paris, Décembre 2011
  35. EXEMPLE DE FONCTIONNEMENT state action goto * + 0 1

    $ E B 0 s1 s2 3 4 1 r4 r4 r4 r4 r4 2 r5 r5 r5 r5 r5 3 s5 s6 acc 4 r3 r3 r3 r3 r3 5 s1 s2 7 6 s1 s2 8 7 r1 r1 r1 r1 r1 8 r2 r2 r2 r2 r2 Grammaire : (1) E -> E * B (2) E -> E + B (3) E -> B (4) B -> 0 (5) B -> 1 Stack State Input Output Action [0] 0 1+1$ s2 [0 , ’1’ , 2] 2 +1$ r5 [0 , B , 4] 4 +1$ 5 r3 [0 , E , 3] 3 +1$ 5 3 s6 [0 , E , 3, ‘+’ , 6] 6 l $ 5 3 s2 [0 , E , 3, ‘+’ , 6 , ‘1’ , 2] 2 l $ 5 3 r5 [0 , E , 3, ‘+’ , 6 , B , 8] 8 $ 5 3 5 r2 [0 , E , 3] 3 $ 5 3 5 2 acc Paris, Décembre 2011
  36. LALR • Visualise un jeton après le jeton actuel pour

    décider de l’action à prendre (change la table de parsing). • Avantages : • Rapide • Léger • Linéaire en la longueur de l’input (indépendant du langage) • Inconvénients : • Extrêmement complexe : obligation d’utiliser un générateur • Gestion des erreurs difficile Paris, Décembre 2011
  37. LEX (RAPPEL) %{ #include "global.h" #include "calc.h" #include <stdlib.h> %}

    blancs [ \t]+ chiffre [0-9] entier {chiffre}+ exposant [eE][+-]?{entier} reel {entier}("."{entier})?{exposant}? %% {blancs} { /* On ignore */ } {reel} { yylval=atof(yytext); return(NOMBRE); } "+" return(PLUS); "-" return(MOINS); "*" return(FOIS); "/" return(DIVISE); "^" return(PUISSANCE); "(" return(PARENTHESE_GAUCHE); ")" return(PARENTHESE_DROITE); "\n" return(FIN); Exemple : interprète d’expressions numériques Exemple d’utilisation : 22*(1+3) => [ NOMBRE , FOIS , PARENTHESE_GAUCHE , NOMBRE , PLUS , NOMBRE , PARENTHESE_DROITE ] Paris, Décembre 2011
  38. YACC / BISON %{ #include "global.h" #include <stdio.h> #include <stdlib.h>

    #include <math.h> %} %token NOMBRE %token PLUS MOINS FOIS DIVISE PUISSANCE %token PARENTHESE_GAUCHE PARENTHESE_DROITE %token FIN %left PLUS MOINS %left FOIS DIVISE %left NEG %right PUISSANCE %start Input %% Input: /* Vide */ | Input Ligne ; Ligne: FIN | Expression FIN { printf("Resultat : %f\n", $1); } ; Expression: NOMBRE { $$=$1; } | Expression PLUS Expression { $$=$1+$3; } | Expression MOINS Expression { $$=$1-$3; } | Expression FOIS Expression { $$=$1*$3; } | Expression DIVISE Expression { $$=$1/$3; } | MOINS Expression %prec NEG { $$=-$2; } | Expression PUISSANCE Expression { $$ = pow($1,$3); } | PARENTHESE_GAUCHE Expression PARENTHESE_DROITE { $$=$2; } ; %% int yyerror(char *s) { printf("%s\n",s); } int main(void) { yyparse(); } Exemple : interprète d’expressions numériques Paris, Décembre 2011
  39. YACC / BISON Exemple : interprète d’expressions numériques %{ #include

    "global.h" #include <stdio.h> #include <stdlib.h> #include <math.h> %} %token NOMBRE %token PLUS MOINS FOIS DIVISE PUISSANCE %token PARENTHESE_GAUCHE PARENTHESE_DROITE %token FIN %left PLUS MOINS %left FOIS DIVISE %left NEG %right PUISSANCE %start Input %% Input: /* Vide */ | Input Ligne ; Ligne: FIN | Expression FIN { printf("Resultat : %f\n", $1); } ; Expression: NOMBRE { $$=$1; } | Expression PLUS Expression { $$=$1+$3; } | Expression MOINS Expression { $$=$1-$3; } | Expression FOIS Expression { $$=$1*$3; } | Expression DIVISE Expression { $$=$1/$3; } | MOINS Expression %prec NEG { $$=-$2; } | Expression PUISSANCE Expression { $$ = pow($1,$3); } | PARENTHESE_GAUCHE Expression PARENTHESE_DROITE { $$=$2; } ; %% int yyerror(char *s) { printf("%s\n",s); } int main(void) { yyparse(); } Associativité Paris, Décembre 2011
  40. YACC / BISON Exemple : interprète d’expressions numériques %{ #include

    "global.h" #include <stdio.h> #include <stdlib.h> #include <math.h> %} %token NOMBRE %token PLUS MOINS FOIS DIVISE PUISSANCE %token PARENTHESE_GAUCHE PARENTHESE_DROITE %token FIN %left PLUS MOINS %left FOIS DIVISE %left NEG %right PUISSANCE %start Input %% Input: /* Vide */ | Input Ligne ; Ligne: FIN | Expression FIN { printf("Resultat : %f\n", $1); } ; Expression: NOMBRE { $$=$1; } | Expression PLUS Expression { $$=$1+$3; } | Expression MOINS Expression { $$=$1-$3; } | Expression FOIS Expression { $$=$1*$3; } | Expression DIVISE Expression { $$=$1/$3; } | MOINS Expression %prec NEG { $$=-$2; } | Expression PUISSANCE Expression { $$ = pow($1,$3); } | PARENTHESE_GAUCHE Expression PARENTHESE_DROITE { $$=$2; } ; %% int yyerror(char *s) { printf("%s\n",s); } int main(void) { yyparse(); } Ordre => Priorité Paris, Décembre 2011
  41. YACC / BISON Exemple : interprète d’expressions numériques %{ #include

    "global.h" #include <stdio.h> #include <stdlib.h> #include <math.h> %} %token NOMBRE %token PLUS MOINS FOIS DIVISE PUISSANCE %token PARENTHESE_GAUCHE PARENTHESE_DROITE %token FIN %left PLUS MOINS %left FOIS DIVISE %left NEG %right PUISSANCE %start Input %% Input: /* Vide */ | Input Ligne ; Ligne: FIN | Expression FIN { printf("Resultat : %f\n", $1); } ; Expression: NOMBRE { $$=$1; } | Expression PLUS Expression { $$=$1+$3; } | Expression MOINS Expression { $$=$1-$3; } | Expression FOIS Expression { $$=$1*$3; } | Expression DIVISE Expression { $$=$1/$3; } | MOINS Expression %prec NEG { $$=-$2; } | Expression PUISSANCE Expression { $$ = pow($1,$3); } | PARENTHESE_GAUCHE Expression PARENTHESE_DROITE { $$=$2; } ; %% int yyerror(char *s) { printf("%s\n",s); } int main(void) { yyparse(); } Priorité identique Paris, Décembre 2011
  42. YACC / BISON Exemple : interprète d’expressions numériques %{ #include

    "global.h" #include <stdio.h> #include <stdlib.h> #include <math.h> %} %token NOMBRE %token PLUS MOINS FOIS DIVISE PUISSANCE %token PARENTHESE_GAUCHE PARENTHESE_DROITE %token FIN %left PLUS MOINS %left FOIS DIVISE %left NEG %right PUISSANCE %start Input %% Input: /* Vide */ | Input Ligne ; Ligne: FIN | Expression FIN { printf("Resultat : %f\n", $1); } ; Expression: NOMBRE { $$=$1; } | Expression PLUS Expression { $$=$1+$3; } | Expression MOINS Expression { $$=$1-$3; } | Expression FOIS Expression { $$=$1*$3; } | Expression DIVISE Expression { $$=$1/$3; } | MOINS Expression %prec NEG { $$=-$2; } | Expression PUISSANCE Expression { $$ = pow($1,$3); } | PARENTHESE_GAUCHE Expression PARENTHESE_DROITE { $$=$2; } ; %% int yyerror(char *s) { printf("%s\n",s); } int main(void) { yyparse(); } $$ : résultat $i : ième token Paris, Décembre 2011
  43. COMPILATION >bison -d calc.y // Crée les fichiers calc.tab.h et

    calc.tab.c >flex calc.lex // Crée le fichier lex.yy.c >gcc -c lex.yy.c -o calc.lex.o >gcc -c calc.tab.c -o calc.y.o >gcc -o calc calc.lex.o calc.y.o -ll -lm //Compile (ll : librairie lex, lm : librairie mathématique) Paris, Décembre 2011