Analyseur de la LR
Dans le de l'informatique, un analyseur de la LR de est un analyseur pour les grammaires indépendantes du contexte qui lit l'entrée du L eft de pour redresser et produit une dérivation ightmost de ''' du ''' R de . L'analyseur de la LR de de limite ( k ) est également employé ; ici le k se rapporte au nombre de " unconsumed ; " de la lecture anticipée ; entrer les symboles qui sont employés en prenant des décisions d'analyse. Habituellement le k est 1 et est souvent omis. Une grammaire indépendante du contexte s'appelle la LR ( k ) si là existe un analyseur de la LR ( k ) pour lui.
On dit qu'un analyseur de la LR exécute l'analyse de bas en haut parce qu'il essaye de déduire les productions de grammaire de niveau supérieur par l'accumulation des feuilles .
Beaucoup de langages de programmation sont décrits par une grammaire qui est la LR (1), ou près d'être ainsi, et pour cette raison les analyseurs de la LR sont employé souvent par les compilateurs pour exécuter l'analyse de syntaxe du code source .
Dans l'utilisation typique quand nous nous référons à un analyseur de la LR nous voulons dire un analyseur particulier capable d'identifier une langue particulière spécifique par une grammaire indépendante du contexte. Elle est commune, cependant, pour employer le terme pour signifier un programme de conducteur qui peut être fourni avec une table appropriée pour produire un nombre large de différents analyseurs de la LR de détail. Cependant, ces programmes s'appellent plus exactement les générateurs d'analyseur.
La LR analysant a beaucoup d'avantages :
Beaucoup de langages de programmation peuvent être analysés using une certaine variation d'un analyseur de la LR. Une exception notable est le C++ .
Des analyseurs de la LR peuvent être mis en application très efficacement.
De tous les analyseurs qui balayent leur entrée de gauche à droite, les analyseurs de la LR détectent des erreurs syntactiques (c'est-à-dire, quand l'entrée ne se conforme pas à la grammaire) aussitôt que possible.
Il est difficile produire des analyseurs de la LR à la main ; ils sont habituellement construits par un générateur d'analyseur ou un Compilateur-compilateur . Selon comment la table d'analyse est produite ces analyseurs s'appellent l'analyseur simple (SLR) de la LR de , Regardent-en avant l'analyseur (LALR) de la LR, et l'analyseur canonique de la LR de . Ces types d'analyseurs peuvent traiter les ensembles de grammaires de plus en plus grands ; Les analyseurs de LALR peuvent traiter plus de grammaires que SLR. Les analyseurs canoniques de la LR travaillent sur plus de grammaires que des analyseurs de LALR. Le populaire Yacc produit des analyseurs de LALR.
Architecture des analyseurs de la LR
Conceptuellement, un analyseur de la LR est un programme récursif qui peut être correct prouvé par calcul direct, et peut être mis en application efficacement comme analyseur récursif , un ensemble de montée de de fonctions mutuel-récursives pour chaque grammaire, tout comme un analyseur récursif de descente de . Par convention, cependant, des analyseurs de la LR sont présentés et mis en application pendant que les machines de pile table-basées en lesquelles la pile des appels du programme récursif fondamental est explicitement manoeuvrée.Une table - l'analyseur de bas en haut conduit du peut être schématiquement présenté comme sur le schéma 1. Ce qui suit décrit une dérivation extrême droite par cet analyseur.
Cas général
L'analyseur est une machine d'état. Il se compose du
un amortisseur de d'entrée de
une pile de sur laquelle est stocké une liste d'états il a été dedans
une table goto de qui prescrit à quel nouvel état il devrait déplacer
une table d'action de qui donne une règle de grammaire pour s'appliquer donné l'état actuel et la borne courante dans le stream d'entrée
L'algorithme d'analyse
L'algorithme d'analyse de la LR fonctionne maintenant comme suit : - La pile est initialisée avec. L'état actuel sera toujours le déclarer qui est au dessus de la pile.
Exemple concret
Pour expliquer ses fonctionnements nous emploierons la petite grammaire suivante dont le symbole de début est E : → E * → DU
DE
- (1) E DU
- DE B (2) E → 1
et analyser l'entrée suivante : du 1 + 1 de
L'action et le Tableau Goto
Les deux 0) tables d'analyse de la LR (pour cette grammaire regardent comme suit :
Procédé d'analyse
La table ci-dessous illustre chaque étape dans le processus. Ici l'état se rapporte à l'élément au dessus de la pile (l'élément extrême droite), et la prochaine action est déterminée en se rapportant à la table d'action ci-dessus. Noter également qu'un $ est apposé à la corde d'entrée pour dénoter la fin du jet.
Revue du projet
L'analyseur commence par la pile contenant juste l'état initial (« 0 ») :
Le premier symbole de la corde d'entrée que l'analyseur voit est « 1 ». Afin de découvrir ce qu'est la prochaine action (le décalage, réduisent, acceptent ou l'erreur), la table d'action est indexée avec l'état actuel (se rappeler que le " ; state" courant ; est juste celui qui est sur le dessus de la pile), qui est dans ce cas-ci 0, et le symbole courant d'entrée, qui est « 1 ». La table d'action spécifie un décalage pour énoncer 2, et ainsi l'état 2 est poussé sur la pile (encore, se rappeler que toute l'information d'état est dans la pile, ainsi " ; décalage pour énoncer 2" ; est la même chose que poussant 2 sur la pile). La pile en résultant est
« 1 » ''' du ''' 2
là où le dessus de la pile est 2. pour l'explication nous montrons également le symbole (par exemple, « 1 », B) qui a causé la transition au prochain état, bien qu'à proprement parler ce ne soit pas une partie de la pile.
Dans l'état que 2 la table d'action indique qu'indépendamment quelle borne nous voyons sur le stream d'entrée, nous devrait faire une réduction avec la règle 5. Si la table est correcte, ceci signifie que l'analyseur a juste identifié le côté droit de la règle 5, qui est en effet le cas. Dans ce cas-ci nous écrivons 5 au train de sorties, sautons un état de la pile (puisque le côté droit de la règle a un symbole), et poussons sur la pile l'état de la cellule dans la table goto pour l'état 0 et le B, c. La pile en résultant est : ''' du ''' 4 du
B de
Cependant, dans l'état 4 la table d'action indique que nous devrions maintenant faire une réduction avec la règle 3. Ainsi nous écrivons 3 au train de sorties, sautons un état de la pile, et trouvons le nouvel état dans la table goto pour l'état 0 et E, qui est l'état 3. La pile en résultant : ''' du ''' 3 du
E de
La prochaine borne que l'analyseur voit est « + » et selon la table d'action il devrait alors aller énoncer 6 : ''' du ''' 3 du
E de « + » ''' du ''' 6
Noter que la pile en résultant peut être interprétée comme histoire d'un automate fini d'état de qui a juste indiqué un E non terminal suivi d'un terminal « + ». La table de transition de cet automate est définie par les actions de décalage dans la table d'action et les actions goto dans la table goto.
La prochaine borne est maintenant « 1 » et ceci signifie que nous effectuons un décalage et allons énoncer 2 : ''' du ''' 3 du
E de « + » ''' du ''' 6 « 1 » ''' du ''' 2
Juste comme le « 1 » précédent celui-ci est réduit à B donnant la pile suivante : ''' DU ''' 8 DE ''' DU ''' 3 DU
E DE
- « + » DE ''' B DU ''' 6
- E D'E + DE B • + → DU
- E DE B E + • → DU
- E DE B E + B • Les règles du ε de → du A de forme ont seulement un → simple du A d'article •. Ces règles seront employées pour dénoter cet état de l'analyseur. Le → E de l'article E • + B, par exemple, indique que l'analyseur a identifié une corde correspondant à E sur le stream d'entrée et la compte maintenant lire « + » suivi d'une autre corde correspondant au B.
Ensembles d'article
Il n'est habituellement pas possible de caractériser l'état de l'analyseur avec un article simple parce qu'il peut ne pas savoir qu'à l'avance qui ordonnent il va employer pour la réduction. Par exemple s'il y a également un → E * B de la règle E puis le → E des articles E • + → E de B et d'E • * B tous les deux s'appliquera après qu'une corde correspondant à E ait été lue. Par conséquent nous caractériserons l'état de l'analyseur par un ensemble d'articles, dans ce cas-ci l'ensemble {→ E d'E • + B, → E D'E • * b}.
Fermeture des ensembles d'article
Un article avec un point devant un non terminal, tel que le → d'E E + • B, indique que l'analyseur compte analyser le B non terminal après. Pour assurer l'ensemble d'article contient toutes les règles possibles que l'analyseur peut être au milieu de l'analyse, il doit inclure tous les articles décrivant comment B lui-même sera analysé. Ceci signifie que s'il y a des règles telles que le → 1 de B et le → 0 de B alors l'ensemble d'article doit également inclure le → des articles B • 1 et → de B • 0. En général ceci peut être formulé comme suit :s'il y a un article du v de → du A de forme • La guerre biologique de dans un article réglé et dans la grammaire il y a une règle du w → du B de forme puis le → du B d'article • le w vrait également être dans l'article réglé.
En placent des articles peuvent être prolongés tels qu'ils satisfont cette règle : continuer simplement à ajouter les articles appropriés jusqu'à ce que tous les nonterminals précédés par des points soient expliqués. La prolongation minimale s'appelle la fermeture de d'un article réglé et écrit comme clos ( I ) de où le I est un ensemble d'article. Elle est ceux-ci les ensembles fermés d'article que nous prendrons comme états de l'analyseur, bien que seulement celui qui sont réellement accessible de l'état de commencer soit inclus dans les tables.
La grammaire augmentée
Avant que nous commencions à déterminer les transitions entre les différents états, la grammaire est toujours augmentée avec une règle supplémentaire → E
- E DE B E + • → DU
Noter encore que la pile correspond à une liste d'états d'un automate fini qui a indiqué un E non terminal, suivi d'« + » et puis d'un B. Dans l'état 8 nous effectuons toujours une réduction avec la règle 2. Noter que les 3 états principaux sur la pile correspondent aux 3 symboles dans le côté droit de la règle 2. ''' du ''' 3 du
E de
En conclusion, nous lisons un « $ » du stream d'entrée qui signifie que selon la table d'action (l'état actuel est 3) l'analyseur accepte la corde d'entrée. Les nombres de règle qui auront été alors écrits au train de sorties seront 3, 5, 2 qui est en effet une dérivation extrême droite du " de corde ; 1 + 1" ; à l'envers.
Construction des tables (de 0) analyses de la LR
Articles < ! -- Cette section est liée de l'analyseur du LALR -->
Construction de ces tables d'analyse est basée sur la notion des articles de la LR de (la 0) (simplement appelés les articles de ici) qui sont des règles de grammaire avec un point spécial supplémentaire quelque part dans le côté droit. Par exemple le → de la règle E E + B a les quatre articles correspondants suivants : → du
E de
• → E DU
DE
- (0) S
- DU → E DU
DE
- DE
- (0) S (1) E DU
- DE B (2) E → 1
- DU → 0 DU
- DU → B DU
- D'E + DE B (3) E (4) B (5) B
C'est pour cette grammaire augmentée que nous déterminerons les ensembles d'article et les transitions entre eux.
Construction de Tableau
Conclusion des ensembles accessibles d'article et des transitions entre eux
La première étape de construire les tables se compose déterminer les transitions entre les ensembles fermés d'article. Ces transitions seront déterminées comme si nous considérons un automate fini qui peut indiquer des bornes aussi bien que des nonterminals. L'état de commencer de cet automate est toujours la fermeture du premier article de la règle supplémentaire : → de S • E : l'article de de
a placé 0 → du
S de • DE- D'E + → DE E • E * DE
- DE B + → DE E • DE
- D'E + DE B + → DE E • DE
- DE B + → DE B • 0 de
+ → de B • 1Le " gras du ; + " de ; devant un article indique les articles qui ont été ajoutés pour la fermeture (ne pas être confondu avec le mathématique « + » l'opérateur qui est une borne). Les articles originaux sans " ; + " de ; s'appellent le grain l'ensemble d'article.
Commencer à l'état de commencer (S0) nous déterminerons maintenant tous les déclarer qui peuvent être atteints de cet état. Les transitions possibles pour un ensemble d'article peuvent être trouvées en regardant les symboles (des bornes et des nonterminals) que nous trouvons bien après les points ; dans le cas de l'article réglé 0 ce sont les bornes « 0 » et « 1 » et l'E et le B. Pour trouver l'article a placé qu'un X de symbole mène à nous suivent le procédé suivant : Prendre l'ensemble, le S , de tous les articles dans l'article courant réglé où il y a un point devant un certain X de symbole.
- Pour chaque article dans le S , déplacer le point à la droite du X .
- Cloeoir l'ensemble en résultant de sujets.
Pour la borne « 0 » ceci a comme conséquence : l'article de de
a placé 1 → 0 du
B de •et pour la borne « 1 » dans : l'article de de
a placé le → 1 du
B de 2 •et pour l'E non terminal dans : l'article de de
a placé le → E du
S de 3 • → E DU- E • * → E DU
- E DE B • + B
et pour le B non terminal dans : l'article de de
a placé le → B du
E de 4 •Noter que la fermeture n'ajoute pas de nouveaux articles dans tous les cas. Nous continuons ce processus jusqu'à ce que plus de nouveaux ensembles d'article ne soient trouvés. Pour les ensembles d'article 1, 2, et 4 il n'y aura aucune transition puisque le point n'est pas devant aucun symbole. Pour l'article réglé 3 nous voyons que le point est devant les bornes « * » et « + ». Pour « * » la transition disparaît : l'article de de
a placé le → E du
E de 5 * •- DE B + → DE B • 0
+ → de B • 1et pour « + » la transition va : l'article de de
a placé le → du
E de 6 E + •- DE B + → DE B • 0
+ → de B • 1Pour l'article réglé 5 nous devons considérer les bornes « 0 » et « 1 » et le B. Pour les bornes nous voyons que résulter a fermé des ensembles d'article sont égal aux ensembles déjà trouvés 1 et 2 d'article, respectivement. Pour le B non terminal la transition va : l'article de de
a placé le → E * B du
E de 7 •Pour l'article réglé 6 nous devons également considérer la borne « 0 » et « 1 » et le B. Comme avant, les ensembles en résultant d'article pour les bornes sont égaux aux ensembles déjà trouvés 1 et 2. Pour le B nontermal la transition va : l'article de de
a placé le → du
E de 8 E + B •Ces ensembles finaux d'article n'ont aucun symbole au delà de leurs points ainsi plus de nouveaux ensembles d'article ne sont ajoutés et nous sommes de finition. La table de transition pour l'automate regarde maintenant comme suit :
Construction de l'action et de la table goto
De cette table et des ensembles trouvés d'article nous construisons l'action et la table goto comme suit : les colonnes pour des nonterminals sont copiées au
- goto de table les colonnes pour les bornes sont copiées à la table d'action en tant que
- d'actions de décalage une colonne supplémentaire pour « $ » (extrémité d'entrée) est ajoutée à la table d'action qui contient CRNA de pour chaque article réglé qui contient le → E de S •.
- si un réglé i d'article contient un article du W de → du A de forme • et le W de → du A est le de règle m avec le > du m ; 0 alors la rangée pour le d'état i dans la table d'action est complètement rempli de m de l'action r de réduction. Le lecteur peut vérifier que ceci a en effet comme conséquence l'action et la table goto qui ont été présentées plus tôt dessus.
Une note au sujet de la LR (0) contre SLR et LALR analysant
Noter que seulement étape 4 du procédé ci-dessus produit réduisent des actions, et ainsi toute réduit des actions doit occuper une rangée entière de table, faisant produire la réduction indépendamment du prochain symbole dans le stream d'entrée. C'est pourquoi ce sont 0) de la LR (analysent les tables : ils ne font aucun lookahead (c'est-à-dire, ils pensent à l'avenir les symboles zéro) avant de décider quelle réduction à exécuter. Une grammaire qui a besoin de lookahead pour désambiguïser des réductions exigerait contenir de rangée de table d'analyse différent réduisent des actions dans différentes colonnes, et le procédé ci-dessus n'est pas capable de créer de telles rangées.
Les améliorations procédés de construction de table de la LR aux 0) ((tel que SLR et LALR ) sont capables de la construction réduisent les actions qui n'occupent pas des rangées entières. Par conséquent, elles sont capables d'analyser plus de grammaires que des analyseurs de la LR (0).
Conflits dans les tables construites
L'automate est construit de telle manière qu'on le garantisse d'être déterministe. Cependant, quand réduire des actions sont ajoutées à la table d'action qu'il peut se produire que la même cellule est remplie d'action de réduction et une action de décalage (un décaler-réduisent le conflit ) ou avec deux différents réduire les actions (un réduire-réduisent le conflit ). Cependant, il peut montrer que quand ceci se produit la grammaire n'est pas des 0) grammaires de la LR (.
Un petit exemple (des 0) grammaires non-LR avec un conflit de décaler-réduction est : → 1
- DE
là où S est un nouveaux symbole de début et E le vieux symbole de début. L'analyseur emploiera cette règle pour la réduction exactement quand il a accepté la corde d'entrée.
Pour notre exemple nous prendrons la même grammaire qu'avant et l'augmenterons : → E * → DU
DE
- (1) E (2) E
- E D'E •
+ → d'E • 1- D'E + → D'E • 1
Il y a un conflit de décaler-réduction dans cet article réglé parce que dans la cellule dans la table d'action pour cet ensemble et la borne « 1 » d'article il y aura une action de décalage pour énoncer 1 et une action de réduction avec la règle 2.
Un petit exemple (des 0) grammaires non-LR avec un conflit de réduire-réduction est :
- DU → B 2 DU
- DU → A 1 DU
DE
- DE
- (1) E (2) E (3) UN → 1
- DU → 1 (4) B
Dans ce cas-ci nous obtenons l'article suivant réglé : l'article de de
a placé 1 → 1 du
A de • → 1 du
B •Il y a un conflit de réduire-réduction dans cet article réglé parce que dans les cellules dans la table d'action pour cet article réglé il y aura une action de réduction pour la règle 3 et une pour la règle 4.
Les deux exemples ci-dessus peuvent être résolus en laissant l'utilisation d'analyseur l'ensemble de suivre (voir l'analyseur du LL) d'un non terminal A de décider s'il va employer un de A s ordonne pour une réduction ; il emploiera seulement le W de → du A de règle pour une réduction si le prochain symbole sur le stream d'entrée est dans l'ensemble de suivre de A . Cette solution a comme conséquence les analyseurs simples de la LR de soi-disant
.
Random links: Adrian John Flook | Constructeur de pont | Winterborne Houghton | Lydia Schenardi | Chronicle de Radziwiłł | Programa_de_análisis_de_LR - D'E + → D'E • 1
Un de l'article nous place trouvent alors est : l'article de de
a placé 1 → 1 du
E de • → 1 DU