Les analyseurs LR ne peut pas gérer ambigu des règles de grammaire, de par leur conception. (En fait de la théorie de la plus facile de retour dans les années 1970, quand les idées sont en cours d'élaboration).
Le C et le C++ permet la déclaration suivante:
x * y ;
Il dispose de deux différents analyse:
- Il peut être la déclaration de y, comme pointeur de type x
- Il peut être une multiplication de x et y, de jeter la réponse.
Maintenant, vous pourriez penser que le dernier est stupide et doit être ignorée.
La plupart seraient d'accord avec vous; cependant, il y a des cas où il pourrait
d'effet secondaire (par exemple, si multipliez est surchargé). mais ce n'est pas le point.
Le point est, il sont deux différentes traite, et, par conséquent, un programme de
peut signifier différentes choses en fonction de la façon dont cela devrait ont été analysés.
Le compilateur doit accepter le plus approprié dans les circonstances appropriées, et en l'absence de toute autre information (par exemple, la connaissance du type de x) doit recueillir à la fois, afin de décider par la suite quoi faire. Ainsi, une grammaire doit permettre cela. Et qui fait de la grammaire ambiguë.
Donc un pur LR analyse ne peut pas gérer cela. Ni beaucoup d'autres largement disponibles analyseur de générateurs, comme Antlr, JavaCC, YACC, traditionnels ou de Bison, ou même PEG-style analyseurs utilisés dans une "pure".
Il y a beaucoup de cas les plus complexes (analyse de la syntaxe du modèle nécessite arbitraire d'anticipation, alors que LALR(k) permettent d'envisager au plus k jetons), mais seulement il ne prend contre-exemple à abattre pur LR (ou les autres) de l'analyse.
De plus réel C/C++ analyseurs de gérer cet exemple par l'utilisation de certaines
type d'analyseur déterministe avec un supplément de hack: ils se mêlent l'analyse avec la table des symboles
une collection... de sorte que par le temps "x" est rencontré,
l'analyseur sait si x est un type ou pas, et peut donc
choisir entre les deux possibilités d'analyse. Mais un analyseur
que ne ce n'est pas sans contexte, et les analyseurs LR
(le pur, etc.) sont (au mieux) sans contexte.
On peut tricher et ajouter des contrôles dans la proposition de réduction de
pour les analyseurs LR pour ce faire, la désambiguïsation. La plupart des autres types d'analyseur
avoir des moyens pour ajouter de la sémantique des contrôles divers points
dans l'analyse, qui peut être utilisé pour ce faire.
Et si vous trichez, vous pouvez faire des analyseurs LR travail pour
Le C et le C++. La GCC gars ont fait pendant un certain temps, mais il l'a donné
pour codée à la main de l'analyse, je pense que parce qu'ils voulaient
mieux erreur de diagnostic.
Il y a une autre approche, cependant, ce qui est agréable et propre
et l'analyse de C et de C++, il suffit d'amende, sans la table des symboles
hackery: GLR analyseurs.
Ce sont sans contexte les analyseurs (ayant réellement infini
d'anticipation). GLR des analyseurs de simplement accepter à la foisanalyse,
la production d'un "arbre" (en fait un graphe dirigé acyclique qui est principalement arborescente)
que représente l'ambiguïté de l'analyser.
Une post-analyse passe peut résoudre les ambiguïtés.
Nous utilisons cette technique dans le C et le C++ avant se termine pour notre
DMS de la Réingénierie du Logiciel boîte à outils.
Ils ont été utilisés pour traiter des millions de lignes
de grand C et C++ de systèmes, complète, précise, analyse la production de ASTs avec tous les détails du code source.