Question

Pourquoi LL (k) et LL (8) sont incompatibles avec la gauche-récursion? Je comprends qu'une langue de LL (k) peut prendre en charge-récursivité gauche à condition que des jetons de k-overahead peuvent être résolus toute ambiguïté. Mais, avec une grammaire LL (8), quel type d'ambiguïtés ne peut pas être résolu?

Était-ce utile?

La solution

Le problème que les variantes $ LL $ ont avec la récursivité gauche est inhérent à la façon dont fonctionne $ LL: $. Il est un analyseur de type haut vers le bas, ce qui signifie qu'il remplace par nonterminals leurs productions

Un $ LL $ œuvres de l'analyseur -style comme suit. Il traverse l'entrée de gauche à droite en une seule fois. Si nous sommes à un moment donné dans l'entrée, nous savons que tout à gauche de ce point est OK. Pour tout à droite de ce point, l'analyseur a construit une « approximation » de ce qu'il attend de voir à côté. Considérons par exemple cette grammaire:

1: $ E \ à E + E $
2: $ E \ x à $

Notez que la grammaire n'est pas $ LL $, mais nous pouvons encore parse entrées dans $ LL $ -style. En entrée $ x + x + x $, un analyseur de style $ LL $ peut finir à la position $ x + \ bullet x + x $. Assumons a décidé que la partie gauche, $ x + $, est très bien, et pour le reste de l'entrée, il attend de voir $ x + E $. Il sera alors savoir que $ x + x + $ est très bien, avec $ E $ restants. Il peut alors remplacer $ E $ par une production, en particulier la production 2 ci-dessus. Avec $ x $ restants, l'analyseur accepte l'entrée.

L'astuce est alors correctement décider de la production en remplacement d'une donnée non-terminal. Une grammaire est $ LL (k) $ si nous pouvons le faire en regardant juste à la prochaine $ k symboles d'entrée de $, et d'autres techniques sont connues qui sont plus puissants.

Considérons maintenant la grammaire suivante:

1: $ A \ à A $ un
2: $ A \ à \ varepsilon $

Si un analyseur LL $ $ tente de remplacer $ A $ par une production, il doit décider entre la production 1 et 2.

Considérons ce que le bon déroulement de l'action serait si notre analyseur était omniscient. Chaque fois qu'il remplace le $ A $ par la production 1, il ajoute 'un $ a $ à ce qu'il attend pour l'entrée restante (le reste attendu va de $ A $ à $ Aa $ à $ Aaa $ ...), mais le $ A $ au début ne disparaît pas. Finalement, il faut choisir la production 2, après quoi le $ A $ disparaît et il ne peut jamais rajouter $ a $ s à l'attente.

Comme il n'y a aucune chance de correspondre à un peu plus de symboles d'entrée, l'analyseur doit décider exactement cette position d'entrée comment la production de nombreuses fois 1 doit être adapté. Cela signifie qu'il doit savoir exactement combien de fois dans notre cas $ a $ apparaîtra dans la suite de l'entrée en ce moment.

Cependant, $ LL (k) $ peut voir que k $ symboles $ avant. Cela signifie que si la production 1 doit être choisi plus de $ k fois de $, l'analyseur ne peut pas « voir » cela et est vouée à l'échec. $ LL (*) $ est mieux à l'analyse syntaxique de $ LL (k) $, car il peut voir arbitrairement loin dans l'entrée, mais le détail crucial (qui est pas toujours mentionné) est que cette préanalyse est normal .

Pour imaginer ce qui se passe, vous pouvez voir l'algorithme comme suit: quand il doit décider la production à prendre, il démarre une machine à états finis (DFA, ce qui est équivalent au pouvoir d'expressions régulières) et permet de cette machine regarder le reste de l'entrée. Cette machine peut alors déclarer 'utiliser cette production. Cependant, cette machine est sévèrement limité dans ce qu'il peut faire. Bien qu'il soit strictement mieux que de regarder seulement la prochaine $ k symboles $, il ne peut pas, par exemple, « compter », ce qui signifie qu'il ne peut pas aider dans la situation ci-dessus.

Même si vous deviez « pirater » dans une fonction de comptage dans cet automate fini, alors il y a encore récursives à gauche grammaires dont vous avez vraiment besoin plus de puissance. Par exemple, pour cette grammaire:

A $ \ A à B $
$ A \ à \ varepsilon $
$ B \ à (B) $
$ B \ to \ varepsilon $

devrait correspondre à « tours » des accolades correspondantes, ce qui est un automate fini ne peut pas faire. Pire encore:

$ A \ B C A D E $
$ A \ A '$
$ A '\ A' D E $
$ A » \ to \ varepsilon $
$ B \ à un B a \ b mi B b \ mid a a \ mi bb $
$ C \ à c C c \ milieu d C d \ mid c c \ mid d d $
$ D \ e à D e \ mid f D f \ mid e e\ Mid f f $
$ E \ g à E g \ mi h E h \ mi g g \ h mi h $

est une grammaire tout à fait terrible, pour lequel je suis sûr que personne ne fonctionne l'algorithme d'analyse syntaxique de temps linéaire connus et tous les algorithmes d'analyse syntaxique général connus prennent du temps du second degré. Pire encore, toute grammaire décrivant cette langue est nécessairement laissé récursif. La grammaire est encore cependant sans ambiguïté. Vous avez besoin d'un analyseur de fabrication artisanale main pour analyser ces monstres dans le temps linéaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top