SKIP

Top  Previous  Next

Skripte > Produktionen > SKIP

 

Mittels des SKIP-Symbols können Abschnitte des Quelltextes für die keine expliziten Regeln existieren beim Parsen zu übersprungen werden.

 

Anmerkung: Der übersprungene Text ist durch xState.str() oder trim_right_copy( xState.str()) zugänglich.

 

Das Schlüsselwort SKIP steht für ein komplexes Symbol, dessen genaue Bedeutung vom jeweiligen Kontext innerhalb eines TETRA-Programms abhängt. Die Bedeutung hängt ab:

 

1. von den jeweiligen Alternativen

 

Eine SKIP-Alternative wird dann ausgewählt, wenn keine der anderen Alternativen auf den aktuellen Text passt. In einer Produktion:

 

(

    "}"

  | "]"

  | SKIP

)*

 

wird nur dann die SKIP-Alternative gewählt, wenn an der aktuellen Textposition keine der schließenden Klammern "}" oder "]" steht.

 

 

2. von den jeweiligen möglichen Nachfolgern

 

Das SKIP-Symbol passt auf den Text, der an der aktuellen Position beginnt und sich bis zu derjenigen Position erstreckt, ab der der Text zu einem Nachfolgesymbol passt. Gibt es mehrere Nachfolgesymbole, die auf nachfolgende Textabschnitte passen, so wird dasjenige gewählt, dessen Übereinstimmung mit dem Text an der kleinsten Position beginnt.

 

Lautet beispielsweise der aktuelle Eingabetext:

 

param1, param2 ] }  ...

 

und die Regel

 

SKIP 

(

    "]" 

  | "}" 

)

 

so wird durch den SKIP der Text "param1, param2 " erkannt, da "]" auf diesen Text unmittelbar folgt, während "}" erst an späterer Stelle folgt.

Die Beispielsregel unter Punkt eins wird dasselbe Resultat haben. Beim ersten Durchlauf der Schleife passt das SKIP-Symbol auf den Text und beim zweiten Durchlauf passt "]". Beim dritten Durchlauf wird dann auch "}" erkannt.

Allerdings ist zu beachten, dass das, was durch SKIP in dieser Regel erkannt wird, auch von den Nachfolgern der Schleife selbst abhängt. Im folgenden Kontext:

 

Startregel ::= Regel1 Regel2

 

Regel1 ::= 

(

    "]"

  | "}"

  | SKIP

)*

 

Regel2 ::= "param2"

 

würde lediglich der Abschnitt: "param1, " erkannt.

 

 

 

Ergänzende Erläuterungen

 

Mögliche Konflikte werden je nach gesetzten Optionen verschieden behandelt.

 

a) Isolation von SKIP und ANY

 

Die Vorkommen des Schlüsselworts "SKIP" müssen voneinander isoliert sein, d.h. ein SKIP darf keinen zweites SKIP als Alternative haben und darf kein zweites SKIP als unmittelbaren Nachfolger haben. Folgendes ist also nicht erlaubt:

 

(SKIP | ...) | (SKIP | ...)  // falsch

 

oder

 

(SKIP | ...) ( SKIP | ...)  // falsch

 

Ebenso darf ANY nicht unmittelbar auf SKIP folgen.

 

(SKIP | ...) ( ANY | ...)  // falsch

 

 

b) SKIP-Wiederholungen

 

 

Die folgende Fälle unterscheiden sich nicht, sie resultieren in einem gleichen Verhalten des Parsers:

 

SKIP?

SKIP*

 

Ein passendes Nachfolgesymbol muss sich entweder an der aktuellen oder an einer späteren Position im Text befinden. Im letzteren Fall wird SKIP einmal ausgeführt.

Der Fall

 

SKIP+

 

unterscheidet sich von den vorhergehenden darin, dass ein Nachfolgesymbol nicht an der aktuellen Position vorhanden sein darf, an einer späteren aber vorkommen muss; aber auch hier wird die Wiederholung auf eine einmalige Ausführung reduziert.

 

c) Konsumation der auszulassenden Zeichen

 

Die Funktion des SKIP Symbols hängt nicht von den Projektoptionen ab! Z.B. wird SKIP EOL auch dann das Zeilenende erkennen, wenn '\r' und '\n' zu den auszulassenden Zeichen gehört. Während xState.str() nach Erkennung eines normalen Tokens einen Textabschnitt liefert, der der vor den nachfolgenden auszulassenden Zeichen abbricht, ist dies bei einem durch SKIP erkannten Textabschnitt nicht der Fall. Wenn die auszulassenden Zeichen Leerzeichen sind, erhält man das entsprechende Resultat durch:

 

trim_right_copyxState.str())

 

 

d) kein dynamisches SKIP

 

Die Menge der Token, die auf SKIP folgen können ist nicht dynamisch veränderbar. Wenn ein Platzhalter-Token, das auf SKIP folgt, durch ein Literal erweitert wird, wird hat Erweiterung keine Auswirkungen auf die Erkennungen durch das SKIP-Symbol.

 

e) Namen der SKIP-Knoten

 

Anmerkung: Der Name eines Skip-Knotens wird gebildet aus "SKIP" und der Nummer, die den Knoten in den Anfängermengen repräsentiert. Also, z.B. SKIP12 ist ein Skipknoten, der in der Anfängermenge des übergeordneten Knotens als Knoten mit der Nummer 12 registriert ist.



Diese Seite gehört zur TextTransformer Dokumentation

Home  Inhalt  English