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

Intro to Lex and Yacc

Intro to Lex and Yacc

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