2017-03-13 3 views
0

Ma tâche consiste à calculer FIRST et SUIVEZ ensembles pour la grammaire suivante:informatique le suivi définit

P ::= S CS . 
S ::= (int , int) 
CS ::= C CS | epsilon 
C ::= left int | right int | low C 

je suis arrivé les premiers sets suivants:

FIRST(S) = {'('} 
FIRST(C) = {left,right,low} 
FIRST(CS) = {left,right,low,epsilon} 
FIRST(P) = FIRST(S) = {'('} 

Pour les ensembles suivants je calculais:

FOLLOW(P) = $ (or empty) 
FOLLOW(C) = {left,right,low,'.'} 
FOLLOW(CS) = {'.'} 
FOLLOW(S) = {left,right,low} 

J'ai essayé ma solution en utilisant d'abord et après le générateur de jeux et ce que j'ai obtenu avec SUIVRE (S) était: FOLLOW(S) = {'.', left, right, low}. La solution du générateur est-elle correcte et pourquoi? J'ai calculé ma solution en utilisant la formule: FOLLOW(S) = FIRST({left,right,low} concat FOLLOW(P)) = {left, right, low}. Quelqu'un peut-il m'expliquer pourquoi la solution de mon/générateur n'est pas correcte et vérifier si j'ai tout le reste correct? Je veux aussi savoir pourquoi je n'ai pas int dans un premier jeu ou un jeu suivant et si cela sera correct avec l'analyseur de construction plus tard de toute façon. Merci

Répondre

1

Lorsque vous calculez des ensembles FOLLOW, vous devez faire attention aux productions vides.

Dans ce cas, CS a une production vide, ce qui signifie que S pourrait être suivie d'une . en P → S CS .. De même, le C en C CS peut-être à la fin de la production, donc C pourrait aussi être suivi d'un .

int ne peut apparaître après un jeton left ou right. Il ne peut jamais apparaître au début d'un nom-terminal ni immédiatement après un non-terminal. Donc, il est entièrement prévu qu'il ne soit pas dans un ensemble FIRST ou FOLLOW.

+0

Merci :) Je pense que je comprends parfaitement maintenant comment fonctionnent les ensembles FIRST et FOLLOW. J'ai seulement une autre question. Selon ces règles, comment déterminer les ensembles FOLLOW, je ne vois aucune règle qui inclurait un '.' dans mon set FOLLOW (S) ... Dois-je juste faire attention aux productions vides comme celle-ci ou y a-t-il une règle qui détermine cela? – Luki

+1

C'est la règle que je précise au deuxième paragraphe de ma réponse, 'P → S CS .'. Si CS est vide, le point suit immédiatement le S. Ou peut-être que je ne comprends pas ce que vous voulez dire. L'ensemble FOLLOW d'un non-terminal est l'ensemble des jetons qui peuvent venir après l'entrée après une instance de ce non-terminal. – rici