web-dev-qa-db-fra.com

Comment identifier si une grammaire est LL (1), LR (0) ou SLR (1)?

Comment identifiez-vous si une grammaire est LL (1), LR (0) ou SLR (1)?

Quelqu'un peut-il s'il vous plaît expliquer en utilisant cet exemple, ou tout autre exemple?

X → Yz | une

Y → bZ | ε

Z → ε

59
Prashant Bhardwaj

Pour vérifier si une grammaire est LL (1), une option consiste à construire la table d'analyse syntaxique LL (1) et à rechercher d'éventuels conflits. Ces conflits peuvent être

  • FIRST/FIRST, où il faudrait prévoir deux productions différentes pour un couple non terminal/terminal.
  • Conflits FIRST/FOLLOW, dans lesquels deux productions différentes sont prédites, l’une représentant le fait que certaines productions doivent être prises et étendue à un nombre non nul de symboles, et l’autre qui indique qu’une production doit être utilisée, indiquant chaîne vide.
  • FOLLOW/FOLLOW, où deux productions indiquent qu’un non-terminal doit être étendu au conflit de chaîne vide.

Essayons ceci sur votre grammaire en construisant les ensembles PREMIER et SUIVANT pour chacun des non-finaux. Ici, on a ça

FIRST(X) = {a, b, z}
FIRST(Y) = {b, epsilon}
FIRST(Z) = {epsilon} 

Nous avons également que les ensembles FOLLOW sont

FOLLOW(X) = {$}
FOLLOW(Y) = {z}
FOLLOW(Z) = {z}

À partir de là, nous pouvons construire la table d'analyse LL (1) suivante:

    a    b    z   $
X   a    Yz   Yz  
Y        bZ   eps
Z             eps

Comme nous pouvons construire cette table d'analyse sans conflits, la grammaire est LL (1).

Pour vérifier si une grammaire est LR (0) ou SLR (1), commençons par construire tous les ensembles de configuration LR (0) pour la grammaire. Dans ce cas, en supposant que X soit votre symbole de départ, nous obtenons ce qui suit:

(1)
X' -> .X
X -> .Yz
X -> .a
Y -> .
Y -> .bZ

(2)
X' -> X.

(3)
X -> Y.z

(4)
X -> Yz.

(5)
X -> a.

(6)
Y -> b.Z
Z -> .

(7)
Y -> bZ.

De là, on peut voir que la grammaire n'est pas LR (0) car il existe des conflits de décalage/réduction dans les états (1) et (6). Plus précisément, parce que nous avons les éléments réduits Z →. et Y →., nous ne pouvons pas dire s'il faut réduire la chaîne vide à ces symboles ou déplacer un autre symbole. Plus généralement, aucune grammaire avec ε-productions n'est LR (0).

Cependant, cette grammaire pourrait être un reflex (1). Pour voir cela, nous augmentons chaque réduction avec le jeu d'anticipation pour les non-finaux particuliers. Ceci restitue cet ensemble d'ensembles de configuration SLR (1):

(1)
X' -> .X
X -> .Yz [$]
X -> .a  [$]
Y -> .   [z]
Y -> .bZ [z]

(2)
X' -> X.

(3)
X -> Y.z [$]

(4)
X -> Yz. [$]

(5)
X -> a.  [$]

(6)
Y -> b.Z [z]
Z -> .   [z]

(7)
Y -> bZ. [z]

Nous n’avons plus de conflits de réduction des quarts de travail. Le conflit dans l'état (1) a été éliminé car nous ne réduisons que lorsque le préfixe est z, ce qui n'entre en conflit avec aucun des autres éléments. De même, le conflit dans (6) a disparu pour la même raison.

J'espère que cela t'aides!

95
templatetypedef

Si vous n'avez ni conflit FIRST/FIRST ni conflit FIRST/FOLLOW, votre grammaire est LL (1).

Un exemple de conflit FIRST/FIRST:

S -> Xb | Yc
X -> a 
Y -> a 

En ne voyant que le premier symbole d'entrée a, vous ne pouvez pas savoir s'il faut appliquer la production S -> Xb ou S -> Yc, car a est dans le PREMIER ensemble de X et Y.

Un exemple de conflit FIRST/FOLLOW:

S -> AB 
A -> fe | epsilon 
B -> fg 

En ne voyant que le premier symbole d'entrée f, vous ne pouvez pas décider d'appliquer la production A -> fe ou A -> epsilon, car f est à la fois dans le PREMIER ensemble de A et dans le suivant de A (A peut être analysé comme epsilon et B comme f).

Notez que si vous n’avez pas de production epsilon, vous ne pouvez pas avoir de conflit FIRST/FOLLOW.

10

Réponse simple: une grammaire est dite LL (1), si la table d'analyse syntaxique LL (1) associée a au plus une production dans chaque entrée de la table.

Take the simple grammar A -->Aa|b.[A is non-terminal & a,b are terminals]
   then find the First and follow sets A.
    First{A}={b}.
    Follow{A}={$,a}.

    Parsing table for Our grammar.Terminals as columns and Nonterminal S as a row element.

        a            b                   $
    --------------------------------------------
 S  |               A-->a                      |
    |               A-->Aa.                    |
    -------------------------------------------- 

Comme [S, b] contient deux productions, il existe une confusion quant à la règle à choisir. Ce n'est donc pas LL (1).

Quelques vérifications simples pour voir si une grammaire est LL (1) ou non. Check 1: La grammaire ne doit pas être laissée récursive. Exemple: E -> E + T. n'est pas LL (1) car il est gauche récursif. Check 2: La grammaire doit être factorisée à gauche.

La factorisation à gauche est requise lorsque deux choix de règles de grammaire ou plus partagent une chaîne de préfixe commune. Exemple: S -> A + int | A .

Check: La grammaire ne doit pas être ambiguë.

These are some simple checks.
2
Anil Kumar

La grammaire LL (1) est une grammaire non ambiguë sans contexte qui peut être analysée par les analyseurs LL (1).

En LL (1)

  • Le premier L représente le balayage des entrées de gauche à droite. Deuxième L signifie Dérivation la plus à gauche. 1 signifie utiliser un symbole d'entrée à chaque étape.

Pour vérifier la grammaire est LL (1), vous pouvez dessiner une table d’analyse prédictive. Et si vous trouvez plusieurs entrées dans la table, vous pouvez dire que la grammaire n’est pas LL (1).

Leur est également un raccourci pour vérifier si la grammaire est LL (1) ou non. Technique de raccourci

1
Badal