60 votes

Exemples de grammaires LL(1), LR(1), LR(0), LALR(1) ?

Existe-t-il une bonne ressource en ligne avec une collection de grammaires pour certains des principaux algorithmes d'analyse syntaxique (LL(1), LR(1), LR(0), LALR(1)) ? J'ai trouvé de nombreuses grammaires individuelles qui appartiennent à ces familles, mais je ne connais pas de bonne ressource où quelqu'un a écrit un grand ensemble de grammaires d'exemple.

Quelqu'un connaît-il une telle ressource ?

0 votes

Il s'agit d'algorithmes d'analyse syntaxique et non de grammaires. Voulez-vous dire des exemples de syntaxe qui nécessitent un type d'analyseur syntaxique ou un autre ?

12 votes

I pensez à que techniquement parlant, LL(1) etc. sont en fait des familles de grammaires. Les algorithmes d'analyse syntaxique qui portent leur nom sont des algorithmes qui peuvent analyser n'importe quelle grammaire faisant partie de la famille de langages.

0 votes

Je vous suggère de jeter un coup d'œil au site web d'ANTLR. Il contient de bonnes grammaires de langue ;)

39voto

Prashant Bhate Points 4669

Exemples tirés de wikipedia

LL(1)

grammaire

S -> F
S -> ( S + F )
F -> a

entrada

( a + a )

étapes de l'analyse syntaxique

S -> "(" S "+" F ")"
  -> ( "F" + F ) 
  -> ( "a" + F ) 
  -> ( a + "a" )       

LR(0)

grammaire

(1) E → E * B
(2) E → E + B
(3) E → B
(4) B → 0
(5) B → 1 

entrada

1 + 1

étapes de l'analyse syntaxique

need to build a parser table and traverse through states.

LR(1)

grammaire

S’ -> S S 
S  -> C C 
C  -> c C | d

entrada

cd

étapes de l'analyse syntaxique

large table

LALR

grammaire

A -> C x A | ε
B -> x C y | x C
C -> x B x | z

entrada

xxzxx

étapes de l'analyse syntaxique

traverse large parser table

Vous pouvez également jeter un coup d'œil à

3 votes

Pouvez-vous me dire comment prouver qu'une grammaire est LR(0) ou SLR(1) ?

0 votes

@katia- Vous voudrez peut-être jeter un coup d'oeil à cs143.stanford.edu Le cours sur les compilateurs de Stanford, qui contient un grand nombre de diapositives et de documents détaillant la manière de procéder. Le deuxième ensemble de problèmes et l'examen de mi-parcours (et leurs solutions) entrent dans les détails à ce sujet.

2 votes

Je ne pense pas que la grammaire donnée soit LR(0). Dans l'état : [S -> E .], [E -> E . + B] nous avons un conflit de shift/reduce. Nous devons utiliser un token de lookahead pour déterminer s'il faut réduire, S -> E . sur $ lookahead, ou continuer à décaler. Le conflit est résolu en utilisant l'ensemble générique FOLLOW pour S, ce qui rend la grammaire SLR non LR(0).

24voto

Jason Moore Points 2257

Techniques d'analyse syntaxique - Guide pratique comporte plusieurs exemples (c'est-à-dire probablement une demi-douzaine par type) de presque tous les types de grammaire. Vous pouvez acheter la 2e édition du livre, bien que la 1re édition soit disponible gratuitement sur le site de l'auteur. site web en format PDF (vers le bas du lien).

L'auteur dispose également de quelques grammaires de test qu'il associe à ses exemples de code de la deuxième édition, que vous trouverez à l'adresse suivante aquí .

Remarque : toutes ces grammaires sont de petite taille (moins de quelques dizaines de règles), car il s'agit évidemment d'un livre publié.

2voto

Ira Baxter Points 48153

Je ne m'attends pas à ce que vous trouviez une grande collection de grammaires organisées de cette façon à dessein. Que gagnerait l'organisateur en retour ?

Ce que vous pourriez faire, c'est de trouver des générateurs d'analyseurs qui correspondent à chaque famille (par exemple, LL(1)), et de chercher des instances d'entrées pour ce générateur d'analyseur, qui seront toutes LL(1) par définition. Par exemple, les grammaires d'ANTLR sont toutes des versions différentes de LL(k) selon la version d'ANTLR que vous choisissez (la description de la version d'ANTLR indiquera quel k elle accepte) ; les grammaires de Bison sont toutes LALR(1) [ignorant la récente option GLR]. Si vous allez sur mon site web (voir bio), vous verrez une liste de grammaires qui sont toutes à peu près sans contexte (c'est-à-dire, pas dans l'une des classes que vous décrivez).

EDIT : Notez la clarification de @Bart Kier que ANTLR peut explicitement marquer une grammaire comme LL(k) pour un k spécifique.

0 votes

Bonne suggestion d'essayer les générateurs d'analyseurs. En utilisant ANTLR, vous pouvez définir manuellement le look ahead comme ceci : options { k=1; } pour LL(1), ou, le défaut options { k=*; } pour LL(k).

0 votes

@Bart Kiers : J'avais l'impression que les anciennes versions d'ANTLR ne pouvaient pas faire k>1 et k=* diversement. Est-ce que toutes les versions acceptent une déclaration explicite ? Toujours intéressant à savoir. Je pensais que le plus récent ANTLR utilisait des lookaheads spécifiques aux règles de grammaire pour déterminer automatiquement ce qu'était le lookahead. Mais je ne suis pas un expert d'ANTLR.

0 votes

Je crois que le lookahead non lié, k=* a été ajouté dans la version 3 d'ANTLR. ANTLR v2.x avait toujours une valeur fixe k . Je jetterai un coup d'œil à ma copie de la référence ANTLR plus tard et si je me trompe, je rectifierai. Mais je suis presque sûr que c'est correct.

1voto

Rock Brentwood Points 11

La plupart des installations de yacc et de ses clones ou remplacements (comme btyacc, hyacc, bison) ont des suites de tests. Les grammaires de ces suites de test constituent ensemble une liste d'exemples. Je suppose qu'il en va de même pour les générateurs de parseurs LL, mais je n'en sais pas grand-chose. Puisque ANTLR a été mentionné, je peux également signaler qu'une recherche rapide révélera le grand dépôt d'exemples suivant sous ANTLR https://github.com/antlr/grammars-v4 Donc, je suppose que ça compte aussi comme une réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X