La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Generalized LR Laurent WOUTERS 01/06/2012.

Présentations similaires


Présentation au sujet: "Generalized LR Laurent WOUTERS 01/06/2012."— Transcription de la présentation:

1 Generalized LR Laurent WOUTERS 01/06/2012

2 Plan Partie 1 – Introduction Partie 2 – Méthode GLR 1 – Historique et Variantes 2 – Graph-Structured Stack 3 – Algorithme GLR 4 – Shared Packed Parse Forest 5 – Right-Nulled GLR 6 – Complexités Partie 3 – Outils Partie 4 – Ouverture 2

3 INTRODUCTION 3

4 Langage de programmation Pour des langages de programmation modernes, la grammaire est en général accessible: -Documents de standardisation: C: ISO/IEC 9899:1999 C++: ISO/IEC 14882:2011 C#: ECMA-334 -Site web pour des projets open source: Java: -Documents de spécification pour dautres: Visual Basic: 4

5 Ambigüité des grammaires Les grammaires des « gros » langages sont de plus en plus complexes: C: 210 règles syntaxiques BNF ECMA Script: 270 règles syntaxiques BNF C# : 1200 règles syntaxiques BNF Ces grammaires sont aussi ambigües, avec des ambigüités difficiles à résoudre tout en gardant la grammaire lisible pour un être humain. LangageNb états LALR(1)Conflits LR C37538 ECMA Script51338 C#

6 Exemple de conflit type NAME primary NAME primary ( exp ) exp primary exp ( type ) exp ( NAME ) … 6 Exemple de conflit LR classique dans les langages avec une syntaxe de type C : exp ( type ) exp ( NAME ) exp exp primary ( exp ) ( primary ) ( NAME )

7 MÉTHODE GLR 7

8 Idée Générale Utiliser un automate LR. Lors dun conflit, explorer les différentes options en parallèle. A tout moment dans la lecture de lentrée, conserver lensemble des états accessibles de lautomate LR pour lentrée lue. 8

9 Historique GLR Knuth 65 LR parsing De Remer 69 LALR parsing De Remer 71 SLR parsing Tomita GLR parsing Farshi 91 Correct GLR Rekers 92 Compact Parse Forest Johnstone & Scott Right Nulled parsing Hilfinger 03 GLR mode dans Bison 9

10 Algorithmes GLR (1) Tomita Algorithme 0 : Algorithme pour le cas où la grammaire na pas de conflit. Algorithme 1: Fonctionne pour toutes les grammaires hors contexte sans règle vide. Algorithme 2: Fonctionne pour toutes les grammaires hors contexte qui nont pas de récursivité à gauche cachés (non terminaison). Algorithme 3: Même contrainte que 2 mais optimise la gestion de la pile. Algorithme 4: Même contrainte que 2 et construit larbre syntaxique abstrait. Lalgorithme 2 est souvent considéré comme la référence. Farshi Modification de lalgorithme 1 pour le faire fonctionner pour toutes les grammaires hors contexte. Mais complexe et inefficace. 10

11 Algorithmes GLR (2) Scott & Johnstone Algorithme 1e: Modification de lalgorithme 1 pour traiter les règles vides mais ne supportant pas la récursivité à droite. Algorithme RNGLR: Algorithme final supportant toutes les grammaires hors contexte. 11

12 Exemple 1 type NAME type NAME. type primary NAME primary ( exp ) primary primary. NAME exp primary exp ( type ) exp S exp $ 12 ( myvar ) ( string ) myvar ( nmspce.ClassA ) obj.field

13 0 S exp $ exp primary$ exp ( type ) exp$ primary NAME$. primary ( exp )$. primary primary. NAME$. 1: S exp $ 5: S exp $ 2 exp primary $ ) primary primary. NAME$. ) 6: primary primary. NAME $. ) A: primary primary. NAME $. ) 3 exp ( type ) exp$ ) primary ( exp )$. ) type NAME) type NAME. Type) exp primary) exp ( type ) exp) primary NAME. ) primary ( exp ). ) primary primary. NAME. ) 7: exp ( type ) exp $ ) B exp ( type ) exp$ ) exp primary$ ) exp ( type ) exp$ ) primary NAME$. ) primary ( exp )$. ) primary primary. NAME$. ) E: exp ( type ) exp $ ) 4: primary NAME $. ) 8: exp ( exp ) $. ) C: exp ( exp ) $. ) 9 type NAME ) type NAME. type ) primary NAME. ) D type NAME. type ) type NAME ) type NAME. type ) 10 type NAME ) type NAME. type ) F: type NAME. type ) ( exp $ primary. NAME primary NAME ( exp type ) ) exp NAME. type NAME. 13 primary (

14 GLR: Stack Splitting BC ( NAME ) $ Effectuer toutes les réductions possibles Passer au token suivant

15 GLR: Graph-Structured Stack (1) B 1 U0U0 U1U1 U2U2 U3U3 15 8C ( NAME type primary exp ) ) 5 $ U4U4 ( NAME ) $ exp

16 GLR: Graph-Structured Stack (2) D 6 10 A F C 2 E 15 ( NAME. NAME ) NAME $ ( NAME primary.. NAME type NAME exp $ U0U0 U1U1 U2U2 U3U3 U4U4 U5U5 U6U6 U7U7 7 type 2 primary 8 exp B ) ) 4 primary exp

17 Exemple 2 17 A a X a X X A X X S X $ 0 S X $ X A X$ X a X$ X $ A a$ a 1: S X $ 4: S X $ X$ 2 X A X$ X a X$ X $ A a$ a 3 X a X$ A a $ a X A X$ X a X$ X $ A a$ a 5: X A X $ 6: X a X $ A A a a X X A a

18 GLR: Stack Head Sharing and ε-Reduction a A X a a X X A X X 4 $ A ((3, 0), A) ((3, 3), A) File de réduction ((3, 2), A) ((3), X) ((2), X) ((6, 3, 3), X) ((6, 3, 2), X) ((5, 2, 3), X) ((5, 2, 2), X) ((6, 3, 0), X) ((5, 2, 0), X) ((4, 1, 0), S) a a $

19 GLR: Résumé Une réduction GLR est laction de réduire la règle correspondante et appliquer immédiatement le shift du symbole de tête. Il faut rechercher dans le graph tous les chemins correspondant à la règle commençant au nœud courant de la pile. 19

20 Table GLR 20 $aXA 0r(X,4,0)p3p1p2 1p4 2r(X,4,0)p3p5p2 3r(A,1,1) r(X,4,0) r(A,1,1) p3 p6p2 4acc 5r(X,3,2) 6r(X,2,2) 0 S X $ X A X$ X a X$ X $ A a$ a 1: S X $ 4: S X $ X $ 2 X A X$ X a X$ X $ A a$ a 3 X a X$ A a $ a X A X$ X a X$ X $ A a$ a 5: X A X $ 6: X a X $ A A a a X X A a 1 A a 2 X a X 3 X A X 4 X 5 S X $ px = transition vers x r(V,r,l) = réduction de V avec la règle r de longueur l

21 GLR: Algorithme (DRIVER) Table GLR Theadsrqueue DRIVER(input) start = nouveau nœud de la pile pour létat 0 heads= {start} rqueue= {} POUR (tous les tokens t dans input) REDUCE(t) SHIFT(t) RETOURNE lensemble des état acceptant dans heads 21

22 GLR: Algorithme (REDUCE) REDUCE(t) POUR (tous les nœuds n représentant un état s dans heads) POUR (toutes les réductions r(X, r, l) dans T(s, t)) POUR (tous les chemins p de longueur l partant de n) Ajouter (p, X) à rqueue TANT QUE (rqueue nest pas vide) Retirer le prochain (p, X) de rqueue REDUCE_PATH(p, X, t) 22

23 GLR: Algorithme (REDUCE_PATH) REDUCE_PATH(p, X, t) left = premier nœud dans le chemin p; o = état représenté par left SI (il existe un nœud d pour létat s dans heads tel que T(o, X) contient p s) SI (il n existe pas de lien X de d vers left) Créer un lien link de d vers left REDUCE_LIMITED(link, t) SINON Créer le nœud d pour létat s dans heads tel que T(o, X) contient p s Créer un lien link de d vers left REDUCE_LIMITED(link, t) 23

24 GLR: Algorithme (REDUCE_LIMITED) REDUCE_LIMITED(link, t) POUR (tous les nœuds n représentant un état s dans heads) POUR (toutes les réductions r(X, r, l) dans T(s, t)) POUR (tous les chemins p de longueur l partant de n et utilisant link) Ajouter (p, X) à rqueue 24

25 GLR: Algorithme (SHIFT) SHIFT(t) tails = heads; heads = {} POUR (tous les nœuds n représentant un état s dans tails) SI (T(s, t) contient p x) SI (heads contient un nœud d pour létat x) Créer un lien de d vers n SINON Créer un nœud d pour létat x dans heads Créer un lien de d vers n 25

26 Arbre Syntaxique 26 A a X a X X A X X S X $ S X aX aX $ S X aX AX $ a S X AX aX $ S X AX AX $ a aa a a $

27 Shared Packed Parse Forest 27 A x1x1 xmxm … aiai ajaj … A y1y1 ypyp … aiai ajaj … A y1y1 ypyp … aiai ajaj … x1x1 xmxm … => Famille Packed node

28 Exemple SPPF 28 A a X a X X A X X S X $ a a $ S a X X X $ A aA

29 GLR: Construction du SPPF, Méthode Tomita Principe: -Chaque arc dans la pile correspond à exactement 1 nœud dans le SPPF -Les arcs de la pile sont labellisés avec leur nœud respectif -Lors dun shift, créer un nœud SPPF pour le terminal -Lors dune réduction -Si le nœud SPPF existe déjà, (pas darc ajouté dans la pile), ajouter la nouvelle famille -Sinon, créer un nouveau nœud SPPF et une famille 29

30 GLR: Construction du SPPF, Méthode Tomita a1a1 A1A1 X5X5 a2a2 a2a2 X3X3 X1X1 A2A2 X4X4 X2X2 4 $ A3A3 ((3, 0), A 1 ) ((3, 3), A 2 ) File de réduction ((3, 2), A 3 ) ((3), X 1 ) ((2), X 2 ) ((6, 3, 3), X 3 ) ((6, 3, 2), X 4 ) ((5, 2, 3), X 3 ) ((5, 2, 2), X 4 ) ((6, 3, 0), X 5 ) ((5, 2, 0), X 5 ) ((4, 1, 0), S) a a $ SPPF a2a2 A2A2 a1a1 A1A1 A3A3 X1X1 X2X2 X3X3 X4X4 X5X5 $ S

31 SPPF Construit avec Tomita 31 a2a2 A2A2 a1a1 A1A1 A3A3 X1X1 X2X2 X3X3 X4X4 X5X5 $ S S a X X X $ A aA

32 GLR: Construction du SPPF, Méthode Rekers Principe: -Similaire à la méthode de Tomita, mais cherche à maximiser la réutilisation des nœuds du SPPF. -Les nœuds du SPPF contiennent plus dinformations: 1 nœud = 1 triplet (x, i, j) -x: symbole du nœud -i: index de départ de la sous-chaîne dentrée matchée par ce nœud -j: index darrivé 32

33 GLR: Construction du SPPF, Méthode Rekers a,0,1 A,0,1 X,0,2 a,1,2 X,1,2 X,2,2 A,1,2 X,1,2 X,2,2 4 $ A,1,2 ((3, 0), A) ((3, 3), A) File de réduction ((3, 2), A) ((3), X) ((2), X) ((6, 3, 3), X) ((6, 3, 2), X) ((5, 2, 3), X) ((5, 2, 2), X) ((6, 3, 0), X) ((5, 2, 0), X) ((4, 1, 0), S) a a $ SPPF a, 0, 1 A, 0, 1 a, 1, 2A, 1, 2X, 2, 2 X, 1, 2 X, 0, 2 $, 2, 3 S, 0, 3

34 SPPF Construit avec Rekers 34 a, 0, 1 A, 0, 1 a, 1, 2 A, 1, 2X, 2, 2 X, 1, 2 X, 0, 2 $, 2, 3 S, 0, 3 S a X X X $ A aA

35 Right-Nulled GLR Principe: Permettre la réduction dune règle si la partie droite du corps de la règle peut être vide. Pour litem A α β, x appliquer la réduction de la règle A α β pour le lookahead x si β ε. 35 *

36 Table RNGLR 36 $aXA 0r(X,4,0)p3p1p2 1p4 2r(X,4,0) r(X,3,1) p3p5p2 3r(A,1,1) r(X,4,0) r(X,2,1) r(A,1,1) p3 p6p2 4acc 5r(X,3,2) 6r(X,2,2) 0 S X $ X A X$ X a X$ X $ A a$ a 1: S X $ 4: S X $ X $ 2 X A X$ X a X$ X $ A a$ a 3 X a X$ A a $ a X A X$ X a X$ X $ A a$ a 5: X A X $ 6: X a X $ A A a a X X A a 1 A a 2 X a X 3 X A X 4 X 5 S X $ px = shift vers x r(V,r,l) = réduction de V avec la règle r de longueur l

37 RNGLR: Algorithme (PARSER) Table RNGLR TEntrée a 1 … a d U 0 … U d RQ SI (d = 0) SI (T(0, $) accepte) => Retourne succès SINON => Retourne échec Créer un nœud v 0 avec létat 0 U 0 = {v0}, R = {}, Q = {}, a d+1 = $ SI (T(0, a 1 ) contient transition vers k) Ajouter (v 0, k) à Q POUR (toutes les réduction dune variable X en 0) Ajouter (v 0, X, 0) à R POUR (i de 0 à d) TANT QUE (U i nest pas vide) TANT QUE (R nest pas vide) => REDUCER(i) SHIFTER(i) 37

38 RNGLR: Algorithme (REDUCER) Prendre un triplet(v, X, m) dans R χ = ensemble des nœuds accessible depuis v avec un chemin de taille m – 1, ou 0 si m = 0 POUR (tous les u dans χ) k = létat représenté par le nœud u l = état successeur de k par X SI (il existe w dans U i représentant l) SI (il ny a pas darc de w vers u) Créer un arc de w vers u SI (m != 0) POUR (toutes les réduction de B à létat l sur a i+1 de longueur t != 0) Ajouter (u, B, t) à R SINON Créer un nœud w dans U i pour létat l et un arc de w vers u SI (T(l, a i+1 ) contient une transition vers h => Ajouter (w, h) à Q POUR (toutes les réduction de B à létat l sur a i+1 de longueur 0) Ajouter (w, B, 0) à R SI (m != 0) POUR (toutes les réductions de B à létat l sur a i+1 de longueur t != 0) Ajouter (u, B, t) à R 38

39 RNGLR: Algorithme (SHIFTER) SI (i = d) RETOURNE Q = {} TANT QUE (Q != {}) Prendre un couple (v, k) dans Q SI (il existe w dans U i+1 représentant k) Créer un arc de w, vers v POUR (toutes les réductions de B à létat k sur a i+2 de longueur t != 0) Ajouter (v, B, t) à R SINON Créer w dans U i+1 représentant k et un arc de w vers v SI (T(k, a i+2 ) contient une transition vers h) Ajouter (w, h) à Q POUR (toutes les réductions de B à létat k sur a i+2 de longueur t != 0) Ajouter (v, B, t) à R POUR (toutes les réductions de B à létat k sur a i+2 de longueur 0) Ajouter (w, B, 0) à R Q = Q 39

40 RNGLR: Construction du SPPF Lalgorithme RNGLR utilise une version modifiée de la méthode de Rekers pour prendre en charge les réductions supplémentaires. Lors de la génération de la table, il faut également construire les bouts de SPPF correspondants à la partie droite des règles pouvant se dériver en ε. 40

41 Complexités n = taille de linput: 41 AlgorithmePire casGrammaire LR(1) FarshiO(n 3 )O(n) Algorithme 1eO(n 2 )O(n) RNGLRO(n 2 )O(n)

42 OUTILS 42

43 https://en.wikipedia.org/wiki/Comparison_of_parser_generators 43 Bisonhttp://www.gnu.org/software/bison/C, C++, Java Elkhoundhttp://scottmcpeak.com/elkhound/C++, OCaml Wormholehttp://www.mightyheave.com/blog/C, Python Hime Parser Generatorhttp://himeparser.codeplex.com/C#

44 OUVERTURE 44

45 LR(*) : Cas dutilisation type NAME type NAME. type primary NAME primary ( exp ) primary primary. NAME exp primary exp ( type ) exp S exp $ 45

46 0 S exp $ exp primary$ exp ( type ) exp$ primary NAME$. primary ( exp )$. primary primary. NAME$. 1: S exp $ 5: S exp $ 2 exp primary $ ) primary primary. NAME$. ) 6: primary primary. NAME $. ) A: primary primary. NAME $. ) 3 exp ( type ) exp$ ) primary ( exp )$. ) type NAME) type NAME. Type) exp primary) exp ( type ) exp) primary NAME. ) primary ( exp ). ) primary primary. NAME. ) 7: exp ( type ) exp $ ) B exp ( type ) exp$ ) exp primary$ ) exp ( type ) exp$ ) primary NAME$. ) primary ( exp )$. ) primary primary. NAME$. ) E: exp ( type ) exp $ ) 4: primary NAME $. ) 8: exp ( exp ) $. ) C: exp ( exp ) $. ) 9 type NAME ) type NAME. type ) primary NAME. ) D type NAME. type ) type NAME ) type NAME. type ) 10 type NAME ) type NAME. type ) F: type NAME. type ) ( exp $ primary. NAME primary NAME ( exp type ) ) exp NAME. type NAME. 46 primary ( Construire un automate déterminant le bon item

47 LR(*) : Automate de décision : type NAME 5: primary NAME 7: Shift D. ) NAME ( $. ) $. ) ( NAME $. )

48 Bibliographie Scott McPeak. Elkhound: A Fast, Practical GLR Parser Generator. Report No. UCB/CSD , University of California, Berkley, December Masaru Tomita. Efficient Parsing of Natural Language. Kluwer Academic, Boston, R. Nozohoor-Farshi. GLR Parsing for e-Grammar. In Generalized LR Parsing, M. Tomita, Kluwer Academic, Jan Rekers. Parser Generation for Interactive Environment. PhD thesis, University of Amsterdam, Elizabeth Scott and Adrian Johnstone. Right-Nulled GLR Parsers. ACM Transactions on Programming Languages and Systems. Volume 28 Issue 4, July


Télécharger ppt "Generalized LR Laurent WOUTERS 01/06/2012."

Présentations similaires


Annonces Google