Académique Documents
Professionnel Documents
Culture Documents
INE 11
Michel Mauny
ENSTA ParisTech
Prnom.Nom@ensta.fr e
INE 11
Prnom.Nom@ensta.fr e
1 / 28
Analyse syntaxique
1
INE 11
Prnom.Nom@ensta.fr e
2 / 28
Analyse syntaxique
Seconde phase dun compilateur ou interpr`te e analyseur peut tre crit ` la main e e a le plus souvent produit automatiquement ` partir dun gnrateur a e e spci ` partir dune grammaire e ea Domaine bien tudi e e thorie bien comprise e littrature abondante e gnrateurs performants e e
INE 11
Prnom.Nom@ensta.fr e
3 / 28
Gnralits e e e
Objectifs : refuser des programmes auxquels on ne saurait pas donner de sens structurer les programmes accepts e
programme source (flux de caractres)
analyseur lexical
Flux de lexmes
analyseur syntaxique
analyseur smantique
gnrateur
Code objet
INE 11
Prnom.Nom@ensta.fr e
4 / 28
Grammaires
Une grammaire G est un quadruplet (N, T , P, S) o` : u N est un ensemble ni de symboles dits non terminaux T est un ensemble de symboles dits terminaux P est lensemble des productions : cest un sous-ensemble de (N T ) N(N T ) (N T ) ; on note un lment (, ) ee de P S est un symbole particulier de N et est appel le symbole de dpart. e e
INE 11
Prnom.Nom@ensta.fr e
5 / 28
Grammaires
Notation : regroupement en 1 |2 | . . . |n de lensemble des r`gles i e ayant le mme membre gauche . e BNF (Backus-Naur Form) : cest le nom quon donne ` ces notations de a grammaire. Utilise pour la dnition du langage Algol ( 1960) e e EBNF (Extended BNF) : BNF + crochets [. . .] pour des lments optionnels ee + accolades {. . .} pour ltoile et {. . .}+ e
INE 11
Prnom.Nom@ensta.fr e
6 / 28
Hirarchie de Chomsky e
Hirarchie de Chomsky . Une grammaire est dite : e de type 3 ou rationnelle si chaque production est ou bien de la forme A wB ou A w o` A et B sont des non terminaux et w est un u terminal, ou alors de la forme A ; de type 2 ou algbrique ou non contextuelle si chaque production e est de la forme A o` A est un non terminal et est une u squence de terminaux ou non terminaux ; e de type 1 ou contextuelle si chaque production est de la forme A o` , et sont des squences de terminaux ou non u e terminaux et = ; de type 0 ou gnrale si chaque production est de la forme , e e sans autre contrainte.
INE 11
Prnom.Nom@ensta.fr e
7 / 28
Exemples
Rationnelle : a bc
S aS C S bC C cC
Grammaires algbriques e
Productions de la forme A Langage L(G ) engendr par G : lensemble des suites nies w de e terminaux que lon peut driver de S par la mthode suivante, o` est ce e e u qui a t driv jusqualors (initialement, = S) : ee e e
1
si est une suite w compose uniquement de terminaux, alors e w L(G ) ; sinon = A o` A est un non terminal : considrons une u e production A et remplaons par , et recommencer en 1. c
INE 11
Prnom.Nom@ensta.fr e
9 / 28
Exemple
INE 11
Prnom.Nom@ensta.fr e
10 / 28
Drivations e
INE 11
Prnom.Nom@ensta.fr e
11 / 28
INE 11
Prnom.Nom@ensta.fr e
12 / 28
Analyse descendante
Interprter les non-terminaux comme des fonctions : e parse_E : ux dentre oui/non (ou Some(arbre)/None) e E E ... E E Probl`mes : e rcursion gauche : e
parse_E() = parse_E() puis reconna + puis parse_E() tre
E E
+ E E )
( E INT
Transformation de grammaires
INE 11
Prnom.Nom@ensta.fr e
14 / 28
INE 11
Prnom.Nom@ensta.fr e
16 / 28
Analyse descendante
Analyse descendante manuelle (par ex. code prcdent) e e contrle total sur lanalyseur o construction dynamique danalyseurs :
permet {wcw } o` w {a, b} , pourtant non algbrique u e analyse de la premi`re occurrence de w construction dune liste e danalyseurs (1 pour chaque caract`re de w ) e puis accepter c et rutiliser la liste produite pour reconna la seconde occurrence de e tre w
Gnrateurs danalyseurs descendants e e grammaires LL(1) Left-to-right scan, Leftmost derivation, 1 lex`me e pour dcider (look-ahead) e assez peu utiliss (classe de langages LL(1), transformations de e grammaires)
Michel Mauny (ENSTA ParisTech) INE 11 Prnom.Nom@ensta.fr e 17 / 28
Analyse ascendante
Principe empiler les lex`mes (shift) e rduire (reduce) une production (remplacer le segment terminal de e la pile par A si A ) Implmentation e ne scrit jamais ` la main e a gnrateurs ecaces (Yacc) danalyseurs ` partir de grammaires e e a
analyse de la grammaire, messages davertissement ventuels e gnration dun automate ` pile (pushdown automaton) e e a
INE 11
Prnom.Nom@ensta.fr e
18 / 28
Gnralits e e e
INE 11
Prnom.Nom@ensta.fr e
19 / 28
OCamlyacc
Gnrateur danalyseurs ascendants pour OCaml e e similaire ` Yacc (pour C, mais aussi Java, etc) a grammaires LALR(1) : LR(1) + compaction de tables grammaire + actions dans un chier parser.mly rsultat dans parser.mli et parser.ml e
INE 11
Prnom.Nom@ensta.fr e
20 / 28
OCamlyacc
Structure de parser.mly %{ prlude e %} dclarations e %% r`gles e %% postlude ( commentaires OCaml ) /* commentaires ` la C */ a /* commentaires ` la C */ a ( commentaires OCaml )
INE 11
Prnom.Nom@ensta.fr e
21 / 28
Structure de parser.mly
Prlude : code OCaml, recopi dans le rsultat e e e Dclarations : e %token <int> INT %token PLUS MINUS TIMES DIV %token LPAREN RPAREN %token EOL %left PLUS MINUS /* lowest precedence */ %left TIMES DIV /* medium precedence */ %nonassoc UMINUS /* highest precedence */ %start main /* the entry point */ %type <int> main
INE 11
Prnom.Nom@ensta.fr e
22 / 28
Structure de parser.mly
R`gles : productions de grammaire + actions e main: expr EOL { $1 } ; expr: INT { $1 } | LPAREN expr RPAREN { $2 } | expr PLUS expr { $1 + $3 } | expr MINUS expr { $1 $3 } | expr TIMES expr { $1 $3 } | expr DIV expr { $1 / $3 } | MINUS expr %prec UMINUS { $2 } ;
INE 11
Prnom.Nom@ensta.fr e
23 / 28
$ ocamlyacc parser.mly produit les chiers parser.mli et parser.ml. type token = INT of (int) | PLUS | MINUS | TIMES | DIV | LPAREN | RPAREN | EOL val main : (Lexing.lexbuf token) Lexing.lexbuf int
INE 11
Prnom.Nom@ensta.fr e
24 / 28
Usage : let _ = try let lexbuf = Lexing.from_channel stdin in while true do let result = Parser.main Lexer.token lexbuf in Printf.printf "%d\n%!" result done with Lexer.Eof exit 0
INE 11
Prnom.Nom@ensta.fr e
25 / 28
Type structur OCaml (gnralement rcursif) e e e e type arith_expr = Intconst of int | Addition of arith_expr arith_expr | Subtraction of arith_expr arith_expr | Multiplication of arith_expr arith_expr | Division of arith_expr arith_expr | Uminus of expr
INE 11
Prnom.Nom@ensta.fr e
26 / 28
expr: INT { Intconst($1) } | LPAREN expr RPAREN { $2 } | expr PLUS expr { Addition($1,$3) } | expr MINUS expr { Subtraction($1, $3) } | expr TIMES expr { Multiplication($1, $3) } | expr DIV expr { Division($1, $3) } | MINUS expr %prec UMINUS { Uminus($2) } ;
INE 11
Prnom.Nom@ensta.fr e
27 / 28
Conclusion
Hirarchie des langages/grammaires e
3 : rationnel ( lexique des langages de programmation) 2 : algbrique ( syntaxe langages de programmation) e 1 : contextuel 0 : gnral e e
INE 11
Prnom.Nom@ensta.fr e
28 / 28
10