Vous êtes sur la page 1sur 10

Principes des lang. de progr.

INE 11
Michel Mauny
ENSTA ParisTech

Prnom.Nom@ensta.fr e

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

1 / 28

Analyse syntaxique
1

Grammaires Analyse Analyse descendante Analyse ascendante OCamlyacc

Michel Mauny (ENSTA ParisTech)

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

Michel Mauny (ENSTA ParisTech)

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

Arbre de syntaxe dite superficielle

analyseur smantique

Arbre de syntaxe dite profonde

gnrateur

Code objet

Michel Mauny (ENSTA ParisTech)

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

Michel Mauny (ENSTA ParisTech)

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

Michel Mauny (ENSTA ParisTech)

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.

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

7 / 28

Exemples
Rationnelle : a bc
S aS C S bC C cC

Algbrique (non contextuelle) : e ai b i avec i > 0


S aSb S ab

Contextuelle : ai b i c i avec i > 0


S aSBC Ca aC CB BC bB bb cC cc S aBC Ba aB aB ab bC bc

(En fait, CB BC nest pas de type 1, mais CB HB HC BC lest, et est quivalente.) e


Michel Mauny (ENSTA ParisTech) INE 11 Prnom.Nom@ensta.fr e 8 / 28

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

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

9 / 28

Exemple

Grammaire des expressions arithmtiques e S E E E E E E E E + E E E / ( E INT E E E E )

Terminaux : constantes enti`res littrales + oprateurs et parenth`ses. e e e e Non-terminaux E et S, et symbole de dpart : S. e

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

10 / 28

Drivations e

Plusieurs drivations possibles pour 1 + 2 3 e


S E E +E INT1 + E INT1 + E E INT1 + INT2 E INT1 + INT2 INT3 S E E E E +E E INT1 + E E INT1 + INT2 E INT1 + INT2 INT3 S E E+ E E +E E E + E INT3 E + INT2 INT3 INT1 + INT2 INT3

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

11 / 28

Arbres danalyse et de syntaxe

Michel Mauny (ENSTA ParisTech)

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

factorisation transformer la grammaire


Michel Mauny (ENSTA ParisTech) INE 11 Prnom.Nom@ensta.fr e 13 / 28

Transformation de grammaires

Eliminer la rcursion gauche : e S S S P +S P S P P F P P F /P P F Factoriser : S PR R Opa S R ... F F (S) INT

Factoriser : S P Opa S S P (idem pour P avec Opm) Opa + Opa

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

14 / 28

Analyseur rcursif descendant e


let rec parse_somme input = match parse_produit input with Some p ... parse_reste_somme input p ... | None None and parse_reste_somme input accu = match parse_oprateur_additif input with ... | None accu e and parse_produit input = match parse_facteur input with Some f ... parse_reste_produit input f ... | None None and parse_reste_produit input accu = match parse_oprateur_multiplicatif input with ... | None accu e and parse_facteur input = match parse_lexeme OPAREN input with Some _ ... parse_somme input ... ... parse_lexeme OPAREN input ... | None begin match parse_lexeme INT input with Some r ... r ... | None None end
Michel Mauny (ENSTA ParisTech) INE 11 Prnom.Nom@ensta.fr e 15 / 28

Analyseur rcursif descendant e


let left_assoc parse_op parse_term input = let rec parse_rest t1 = match try Some(parse_op input) with Parse_error None with Some f let t2 = parse_term input in parse_rest (f t1 t2) | None t1 in let t = parse_term input in parse_rest t

Michel Mauny (ENSTA ParisTech)

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

LR (Left-to-right scan, Rightmost derivation)

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

18 / 28

Gnralits e e e

Avantages lisibilit, maintenabilit e e ecacit e

Inconvnients e mise au point quelquefois dicile

Michel Mauny (ENSTA ParisTech)

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

Michel Mauny (ENSTA ParisTech)

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 )

Michel Mauny (ENSTA ParisTech)

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

Michel Mauny (ENSTA ParisTech)

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 } ;

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

23 / 28

OCamlyacc : interface de lanalyseur

$ 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

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

24 / 28

OCamlyacc : programme principal

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

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

25 / 28

Arbres de syntaxe abstraite

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

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

26 / 28

Production darbres de syntaxe

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) } ;

Michel Mauny (ENSTA ParisTech)

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

Syntaxe des langages


grammaires algbriques e analyse descendante, programmation directe analyse ascendante : Yacc

Michel Mauny (ENSTA ParisTech)

INE 11

Prnom.Nom@ensta.fr e

28 / 28

10

Vous aimerez peut-être aussi