Search code examples
syntaxcompilationcompiler-constructiongrammarll-grammar

Compilation - LL1 Grammar


I am studying the magic of compilers and I don't understand a result.

Here is the grammar :

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

When I try to find the "first" and "follow" sets, I get different results than the one I get when I do it with an online predictor.

Here are the results given:

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

Why isn't the follow set of G {e, ., #} ? Because what I understand is that according to the A rule, D follow the G, so we add ., but it could also have been EPSILON, so we move to the E and it can be a e, but it could also have been EPSILON, so we move to the #, in respect with the S rule.

What am I missing here ?

I used the tool at http://hackingoff.com/compilers/predict-first-follow-set


Solution

  • Your computation of the FOLLOW set of G is correct.

    The hackingoff tool is buggy. Here is a shorter grammar which exhibits the same error:

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

    It's obvious that a is in the FOLLOW set for B but the tool reports that set as empty.