Quelle est la différence entre Left Factoring
et Left Recursion
? Je comprends que Left factoring
est une technique d'analyse descendante prédictive. Mais je me perds quand j'entends ces deux termes.
La factorisation gauche supprime le facteur gauche commun qui apparaît dans deux productions du même non-terminal. Ceci est fait pour éviter un retour en arrière par l'analyseur. Supposons que l'analyseur ait un aperçu de l'avenir, considérons cet exemple.
A -> qB | qC
où A, B, C sont des non-terminaux et q est une phrase . Dans ce cas, l’analyseur sera confus quant à laquelle des deux productions choisir, et il se peut qu’il doive revenir en arrière. Après avoir quitté la factorisation, la grammaire est convertie en
A -> qD
D -> B | C
Dans ce cas, un analyseur avec anticipation choisira toujours la bonne production.
La récursivité de gauche est un cas où le non-terminal le plus à gauche dans la production d'un non-terminal est le non-terminal lui-même (récursivité directe à gauche) ou, via d'autres définitions non-terminaux, réécrit à nouveau vers le non-terminal (indirect récursion gauche) . Considérez ces exemples -
(1) A -> Aq (direct)
(2) A -> Bq B -> Ar (indirect)
La récursion gauche doit être supprimée si l'analyseur effectue une analyse descendante
Left Factoring est une technique de transformation grammaticale. Elle consiste à "factoriser" les préfixes communs à deux productions ou plus.
Par exemple, en partant de:
A → α β | α γ
à:
A → α A '
A '→ β | γ
Left Recursion est une propriété d'une grammaire chaque fois que vous pouvez dériver d'une variable donnée (non terminal) un rhs commençant par la même variable, en une ou plusieurs étapes.
Par exemple:
A → A α
ou
A → B α
B → A γ
Il existe une technique de transformation de la grammaire appelée Élimination de la récursivité gauche, qui fournit une méthode pour générer une grammaire récursive gauche, une autre grammaire équivalente et non récursive.
La relation/confusion entre les deux termes provient probablement du fait que les deux techniques de transformation doivent éventuellement être appliquées à une grammaire avant de pouvoir en déduire un analyseur prédictif descendant.
C'est ainsi que j'ai vu les deux termes utilisés:
facteur de gauche:
Soit la grammaire donnée: A -> ab1 | ab2 | ab3
1) nous pouvons voir que, pour chaque production, il existe un préfixe commun & si nous choisissons n'importe quelle production ici, il n'est pas confirmé que nous n'aurons pas besoin de revenir en arrière.
2) il est non déterministe, car nous ne pouvons choisir aucune production et nous sommes assurés que nous atteindrons la chaîne souhaitée en créant le bon arbre d’analyse syntaxique. mais si nous réécrivons la grammaire d’une manière déterministe tout en nous laissant suffisamment de souplesse pour lui permettre de faire toute chaîne possible sans revenir en arrière ... ce sera:
A -> aA ', A' -> b1 | b2 | b3 Maintenant, si on nous demande de créer l'arbre d'analyse pour la chaîne ab2 ... nous n'avons pas besoin du suivi. Parce que nous pouvons toujours choisir la bonne production quand nous obtenons A ', nous allons donc générer le bon arbre d'analyse.
Récursion gauche:
A -> Aa | b ici, il est clair que l’enfant de gauche de A sera toujours A si nous choisissons la première production, c’est la récursion qui reste. Parce que A s’appelle encore et encore. la chaîne générée à partir de cette grammaire est la suivante:
A -> bA ' A' -> E | aA ' maintenant nous n’aurons pas quitté la récursivité et nous pouvons aussi générer ba *.
Récursion gauche: Une grammaire est laissée récursive si elle a un non-terminal A tel qu'il existe une dérivation A -> Aα | β où α et β sont des séquences de terminaux et de non terminaux qui ne commencent pas par A.
Lors de la conception d'un analyseur top down, si la récursion gauche existe dans la grammaire, l'analyseur tombe dans une boucle infinie, ici parce que A essaie de faire correspondre A lui-même, ce qui n'est pas possible . Nous pouvons éliminer la récursion gauche ci-dessus en réécrivant la production incriminée. Comme-
A -> βA '
A '-> αA' | epsilon
Factorisation à gauche: La factorisation à gauche est nécessaire pour éliminer le non-déterminisme d'une grammaire. Supposons une grammaire, S -> abS | aSb
Ici, S dérive le même terminal a dans la règle de production (deux choix possibles pour S), ce qui suit le non déterminisme. Nous pouvons réécrire la production pour reporter la décision de S as-
S -> aS '
S '-> bS | Sb
Ainsi, S 'peut être remplacé pour bS ou Sb
récursivité gauche: = lorsque non terminal gauche est identique au non terminal droit. Exemple: A-> A & | B où & est alpha . Nous pouvons supprimer la ricursion gauche en utilisant la réécriture de la production comme suit.
A-> BA ' A' -> & A '| €
Le facteur de gauche signifie que la production ne doit pas être non déterministe. . Exemple: A -> & A | & B | & C