2017-03-13 4 views
0

Meine Aufgabe ist es, zunächst zu berechnen und FOLLOW-Sets für die folgende Grammatik:die FOLLOW Computing setzt

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

Ich habe die folgenden ersten Sätze:

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

Für folgende Sätze I berechnet:

Ich versuchte meine Lösung mit ersten und folgen Sätze Generator und was ich mit FOLLOW (S) bekam war: FOLLOW(S) = {'.', left, right, low}. Ist die Lösung des Generators richtig und warum? Ich berechnete meine Lösung mit Formel: FOLLOW(S) = FIRST({left,right,low} concat FOLLOW(P)) = {left, right, low}. Kann mir bitte jemand erklären, warum meine/generator Lösung nicht stimmt und überprüfen ob ich alles andere richtig verstanden habe? Ich möchte auch wissen, warum ich int in keinem ersten oder folgen Satz habe und ob das mit Bau Parser später in Ordnung sein wird. Danke

Antwort

1

Wenn Sie FOLLOW-Sets berechnen, müssen Sie mit leeren Produktionen vorsichtig sein.

In diesem Fall hat eine leere CS Produktion, was bedeutet, dass S könnte durch eine . in P → S CS . folgen. In ähnlicher Weise könnte die C in C CS am Ende der Produktion sein, so C auch durch ein .

int kann erst nach einem left oder right Token erscheinen verfolgt werden kann. Es kann niemals am Anfang eines Nom-Terminals oder unmittelbar nach einem Nicht-Terminal erscheinen. Es ist also völlig zu erwarten, dass es sich nicht um einen ERSTEN oder FOLGENDEN Satz handelt.

+0

Vielen Dank :) Ich denke, ich verstehe jetzt völlig, wie FIRST und FOLLOW funktioniert. Ich habe nur noch eine Frage. Gemäß diesen Regeln, wie FOLLOW-Sets zu bestimmen sind, kann ich keine Regel sehen, die ein '.' Enthalten würde. in mein FOLLOW (S) set ... Muss ich bei solchen leeren Produktionen nur vorsichtig sein oder gibt es tatsächlich eine Regel, die das bestimmt? – Luki

+1

Es ist die Regel, die ich im zweiten Absatz meiner Antwort, "P → S CS." Wenn CS leer ist, folgt der Punkt unmittelbar auf S. Oder vielleicht verstehe ich nicht, was Sie meinen. Die FOLLOW-Menge eines Nichtterminals ist die Menge von Token, die mir als nächstes nach einer Instanz dieses Nichtterminals als nächstes kommen können. – rici