FOLLOW Menge erzeugen



  • Hallo,

    Gegeben ist eine Grammatik G = (N, T, P, S); // zum Erzeugen von arithmetischen Ausdrücken

    nicht-Terminalsymbole N = {expr, term, fact, E, T}
    Terminalsymbole       T = {v, +, -, *, /, (, )}
    Startsymbol           S = {expr}
    Leerstring              = [e]epsilon[/e]
    Stringende              = $
    
    Produktionen
    P = 
    {
    expr -> term E
    term -> fact T
    fact -> v | (expr)
    E    -> + term E | - term E | [e]epsilon[/e]
    T    -> * fact T | / fact T | [e]epsilon[/e]
    }
    

    Als Lösung ist folgendes gegeben:

    FIRST         FOLLOW
    expr   (, v          ), $
    term   (, v          ), +, -, $
    fact   (, v          ), +, -, *, /, $
    E      +, -, [e]epsilon[/e]       ), $
    T      *, /, [e]epsilon[/e]       ), +, -, $
    

    Frage:
    wie kommt man auf das "$" in der FOLLOW-Menge von expr ?

    soweit komm ich:

    FOLOLOW(expr) = )
    FOLLOW(term)  = FOLLOW(expr), FOLLOW(E), FIRST(E) = ), +, -, [e]epsilon[/e]
    FOLLOW(fact)  = FOLLOW(term), FIRST(T)            = ), +, -, *, /, [e]epsilon[/e]
    FOLLOW(E)     = FOLLOW(expr), FOLLOW(E)           = )
    FOLLOW(T)     = FOLLOW(term), FOLLOW(T)           = ), +, -, [e]epsilon[/e]
    

    gut, was ich so mitgekriegt hab, sind $ und ε irgendwie gleich, also passt das Ergebnis bis auf das verfluchte $ in FOLLOW(expr)

    Der Algorithmus zum Erzeugen der FOLLOW-Menge:

    wiederhole
        für { alle Vorkommen von X auf der rechten Seite einer Produktion p }
        {
        falls {p= A->...X[e]sigma[/e] mit [e]sigma[/e] [e]ne[/e] [e]epsilon[/e]} nimm FIRST([e]sigma[/e]) [e]cap[/e] T  in FOLLOW(X) auf
    
        falls {p= A->...X[e]sigma[/e] mit [e]sigma[/e] => [e]epsilon[/e]} nimm FOLLOW(A) [e]cap[/e] T  in FOLLOW(X) auf
    
        }
    solange bis alle FOLLOW-Mengen stabil bleiben
    

    thx
    Martin


Anmelden zum Antworten