BREAK |
Top Previous Next |
Skripte > Produktionen > BREAK
Mit BREAK können Schleifen - (...)* oder (...)+ - abgebrochen werden. Stößt der Parser innerhalb einer Schleife auf ein BREAK-Symbol, so wird die Schleife verlassen und das Parsen wird mit den auf die Schleife folgenden Token und Regeln fortgesetzt. Z.B.:
( "a" "b" "c"| "d" | BREAK)+ "e"
würde auf folgende Texte passen:
"a b c d a b c e" "d d d e" "e"
(A | BREAK)+ wäre äquivalent zu (A)*
Da mit BREAK stets ein Schleifendurchlauf abgebrochen wird, kann auf BREAK kein weiterer Knoten folgen, auch keine semantische Aktion. Soll eine solche mit BREAK verbunden werden, so muss sie vor dem BREAK-Symbol definiert werden:
( "a" "b" "c"| "d" | {{out << "break";}} BREAK)+ "e"
Das BREAK-Symbol muss in der gleichen Produktion stehen in der auch die Schleife definiert ist, die durch das BREAK-Symbol abgebrochen wird und das BREAK-Symbol hat nur innerhalb einer Schleife Bedeutung. Es ist also nicht möglich das obige Beispiel in zwei Produktionen aufzusplitten:
xxx ::= ( "a" "b" "c"| "d" | Break)+ "e"
Break = {{out << "break";}} BREAK // falsch
Die Verwendung des BREAK-Symbols ist in diesen genannten Aspekten analog zum Schlüsselwort "break" in C++. Tatsächlich wird im erzeugten Code BREAK durch "break" ersetzt.
Mittels des BREAK-Symbols lassen sich Textstrukturen analysieren, die die normale Top-Down-Analyse - z.B. Parser, die auf der reinen EBNF-Syntax beruhen - vor ein unlösbares Problem stellen. Ein Text könnte beispielsweise folgender Regel gemäß strukturiert sein:
(";" "a" )+ ";" "b"
Diese Regel ist syntaktisch einwandfrei, provoziert jedoch die Warnmeldung:
";" ist Anfänger und Nachfolger löschbarer Strukturen
In diesem Fall darf die Warnung nicht ignoriert werden. Das Parsen des Eingabetextes
"; a ; b"
z.B. führt zu einem Fehler. Nachdem "; a" erkannt wurde, gibt es einen Konflikt zwischen einer Fortsetzung mit einem erneuten Durchlauf der Schleife und einer Fortsetzung mit ";" "b". Der TextTransformer entscheidet sich in solchen Fällen stets für die erste Alternative. Nach Erkennung des zweiten Semikolons wird also "a" erwartet und nicht das im Text stehende "b". Hier kann das BREAK-Symbol helfen, indem die Regel umformuliert wird zu:
(";" ( "a" | BREAK ) )+ "b"
Der Eingabetext wird nun richtig erkannt. Wieder wird das zweite Semikon am Beginn des zweiten Durchlaufs der Schleife erkannt. Nun wird aber die BREAK-Alternative gewählt und damit wird die Schleife verlassen und das "b" im Text wird durch das der Schleife folgende "b" der Regel richtig erkannt. Eine andere Umformulierung der ersten Regel hätte auch zu einer Erkennung des gesamten Textes geführt:
(";" ( "a" )? )+ "b"
Diese Regel würde jedoch auch zu Texten passen, die nicht in der ursprünglichen Intention lagen. Z.B. zu ";;;b"
|
Diese Seite gehört zur TextTransformer Dokumentation |
Home Inhalt English |