Anfänger und Nachfolger löschbarer Strukturen

Top  Previous  Next

Grammatiktests > Anfänger und Nachfolger löschbarer Strukturen

 

Die Warnmeldung

 

LL(1) Warnung: "X" ist Anfänger und Nachfolger löschbarer Strukturen

 

erscheint, wenn mit dem Terminalsymbol "X" eine löschbare Struktur beginnt und das gleiche Terminalsymbol auf diese Struktur folgen kann. Löschbare Strukturen sind (...)? und (...)*.  Ein Beispiel wäre die folgende Regel zur Erkennung einer Zahl, die möglicherweise Nachkommastellen aufweist:

 

Zahl ::= ( Ziffernfolge "," )? Ziffernfolge

// LL(1) Warnung: Ziffernfolge ist Anfänger und Nachfolger löschbarer Strukturen

 

Trifft nun ein TETRA-Programm auf eine Ziffernfolge, so wird automatisch die löschbare Struktur getestet. Folgt dann kein Komma, wird das Programm mit einer Fehlermeldung abgebrochen. Die Regel sollte daher besser umgekehrt formuliert werden:

 

Zahl ::= Ziffernfolge ( "," Ziffernfolge )?

 

 

Da von der gewählten Startregel abhängt welche Produktionen geparst werden, kann von dieser Wahl auch abhängen, ob ein Token Anfänger und Nachfolger einer löschbaren Struktur ist oder nicht.

 

Ein Beispiel für diesen Satz erhält man, wenn man das letzte Beispiel weiter ausspinnt. So wäre denkbar, dass die Zahl-Produktion in einer Zahlenpaar-Produktion steht, in der zwei Zahlen durch Kommas getrennt werden sollen. Z.B.:

 

Zahlenpaar  ::= Zahl "," Ziffernfolge

 

Erneut ist das Komma Anfänger und Nachfolger einer löschbaren Struktur.

 

 

Die Erzeugung dieser Warnung kann durch Setzen der entsprechenden Projekt-Option unterdrückt werden.

 

 

Ein weiteres Beispiel ist in der Literatur ist als dangling else bekannt. Folgende zwei Regeln verletzen die LL(1)-Bedingung:

 

Statement ::= IfStatement | ...

IfStatement ::= "if" Expression "then" Statement

                   ( "else" Statement )?

            

Die Anweisung:

 

if a then if b then c else d

 

würde TETRA folgendermaßen interpretieren

 

if a then

{

  if b then

     c

     else

     d

}     

 

d.h. TETRA würde den else-Zweig dem if b zuordnen. Logisch betrachtet wäre jedoch folgenden Zuordnung ebenso möglich:

 

if a then

{

  if b then

     c

}      

else

d

 

 

 



Diese Seite gehört zur TextTransformer Dokumentation

Home  Inhalt  English