2017-05-15 3 views
0

J'étudie la magie des compilateurs et je ne comprends pas un résultat.Compilation - LL1 Grammaire

Voici la grammaire:

S -> A # 
A -> B G D E 
B -> + | - | EPSILON 
C -> c C | EPSILON 
G -> c C 
D -> . C | EPSILON 
E -> e B G | EPSILON 

Lorsque je tente de trouver le « premier » et « suivre » des jeux, je reçois des résultats différents que celui que je reçois quand je le fais avec un facteur prédictif en ligne.

Voici les résultats donnés:

Non-terminal Symbol/Follow Set 
    S     $ 
    A     # 
    B     c 
    C    e, ., # 
    G     ., # 
    D     e, # 
    E     # 

Pourquoi pas le jeu de suivi de G {e,, #.}? Parce que ce que je comprends est que selon la règle A, D suit le G, donc nous ajoutons., Mais il aurait aussi pu être EPSILON, donc nous passons à l'E et ça peut être ae, mais ça aurait aussi pu être EPSILON , donc nous passons au #, en respect avec la règle S.

Qu'est-ce qui me manque ici?

J'ai utilisé l'outil à http://hackingoff.com/compilers/predict-first-follow-set

Répondre

1

Votre calcul de l'ensemble FOLLOW de G est correcte.

L'outil hackingoff est buggé. Voici une grammaire plus courte qui présente la même erreur:

S -> a B C a 
B -> b 
C -> EPSILON 

Il est évident que a est dans l'ensemble FOLLOW pour B mais les rapports d'outils qui définissent comme vide.

+0

Merci. J'ai utilisé http://hackingoff.com/compilers/predict-first-follow-set – eli0T