5.2.  Reguläre Ausdrücke in XFST

5.2.1 Symbole
5.2.2 Operatoren
5.3 Sprachen
5.3.1 Zeichen(ketten)
5.3.2 Konkatenation
5.3.3 Reguläre Sprachen
5.4 Sprachen von EA
5.4.1 DEA
5.4.2 NEA
5.4.3 Äquivalenz
5.5 Vertiefung

Reguläre Ausdrücke (RA) in XFST  

Beispiel 5.2.1 (Einlesen und Kompilieren eines RA mit xfst).
read regex RA ; # EA auf Stack
define varname RA ; # EA als Variable

Beziehung zwischen RA, DEA und formalen Sprachen 
Zu jedem regulären Ausdruck RA existiert mindestens ein EA, der die vom RA bezeichnete reguläre Sprache akzeptiert.


pict

Abbildung 5.3: Beziehung zwischen formalen Sprachen, regulären Ausdrücken und endlichen Automaten (aus [BEESLEY und KARTTUNEN 2003b])


5.2.1.  Zeichensymbole

Normales Zeichensymbol 

Beispiel 5.2.2 (xfst und Zustandsdiagramm).

read regex a ;

pict

Zulässige Einzelsymbole

Jedes der folgenden alphanumerischen Symbole x bezeichnet als regulärer Ausdruck (RA) die Sprache {x}:

%-geschütztes Zeichensymbol (escape symbol

Beispiel 5.2.3 (xfst und Zustandsdiagramm).

read regex %( ;

pict

Spezialsymbole

Das Zeichen % gefolgt von einem der folgenden Symbole x

0 ? + * | . , : ; - / % ~ ( ) [ ] { } " \

bezeichnet als RA die Sprache {x}.

Hinweise

Zitiertes Zeichensymbol 

Beispiel 5.2.4 (xfst und Zustandsdiagramm).

read regex "(" ;

pict

Mehrzeichensymbol

Jedes Zeichen x zwischen doppelten Hochkommata ausser

\, " und getippter Zeilenwechsel

bezeichnet als RA die Sprache {x}.

Hinweis

Zwischen Hochkommata verlieren alle Zeichen ihre Sonderbedeutung.

Backslash-Notation zwischen doppelten Hochkommata 
Backslash-Notation für nicht-druckbare Zeichen und numerische Zeichenkodes sind zwischen doppelten Hochkommata möglich.

Hinweise

Symbole aus mehreren Zeichen (multicharacter symbols

Beispiel 5.2.5 (xfst und Zustandsdiagramm).

read regex Nominativ ;

read regex %+masc%+ ;

pict
pict

Mehrzeichensymbol

Jede Folge von normalen Zeichen oder %-geschützten Zeichen ist ein Mehrzeichensymbol x, das als RA die Sprache {x} bezeichnet.

Hinweis

Mehrzeichensymbole werden von einem endlichen Automaten in einem einzigen Zustandübergang konsumiert.

Zitierte Mehrzeichensymbole  
Auch Mehrzeichensymbole lassen sich mit doppelten Hochkommata zitieren. Es gelten die gleichen Regeln wie bei den Einzelzeichensymbole. In zitierten Symbolen verliert % seine Rolle als Escape-Zeichen.

Beispiel 5.2.6 (xfst und Zustandsdiagramm).

read regex "+Nom";

pict

Guter Programmierstil

Epsilon-Symbol 
Das Ziffern-Zeichen 0 ist ein Spezial-Symbol, das als RA die Sprache {ϵ} bezeichnet.

Beispiel 5.2.7 (xfst und Zustandsdiagramm).

read regex 0 ;

pict

Hinweise

Um die Ziffer 0 als Einzelzeichen zu erhalten, muss sie geschützt oder zitiert werden.

Die Sprache {ϵ} kann mit "" oder [] notiert werden.

Any-Symbol 
Das Zeichen ? ist ein Spezial-Symbol, das als RA die Sprache aller Zeichenketten aus 1 Symbol bezeichnet.

Beispiel 5.2.8 (xfst und Zustandsdiagramm).

read regex ? ;

pict

Hinweis

Dank der Mehrzeichensymbole ist in xfst der Vorrat an Symbolen (das Alphabet) über den Zeichensatz hinaus unbeschränkt erweiterbar.

5.2.2.  Operatoren

Reguläre Operatorenausdrücke in xfst

Wenn die beiden RA A und B die Sprachen A bzw. B bezeichnen, dann bezeichnet der RA

Hinweise zur Operator-Syntax  

Beispiel 5.2.9 (Präzedenz von Operatoren). Welcher der beiden RA entspricht dem Zustandsdiagramm?

read regex a | b & c ;  
read regex a | [ b & c ] ;

pict

Klammernotation für Konkatenation 
Jeder RA wie {TEXT} steht für die Konkatenation aller Einzelzeichen, die zwischen den geschweiften Klammern notiert sind: [T E X T].

Beispiel 5.2.10 (xfst und Zustandsdiagramm).

read regex {clear}|{clever}  
           |{ear}|{ever}  
           |{fat}|{father};

pict

Hinweis

Endliche Automaten speichern Lexika kompakter als Suchbäume (Buchstabenbäume, Trie), weil für die Wörter nicht bloss die gemeinsamen Präfixe, sondern auch die gemeinsamen Suffixe nur einmal repräsentiert sind.

Operatoren für Komplemente  
Wenn der RA A die Sprache A über Σ bezeichnet, dann bezeichnet der RA

Universale Sprache, Komplement und Subtraktion

Die Sprache Σ notiert sich in xfst als [ ?* ] und heisst universale Sprache . Für das Sprach-Komplement von A gilt die folgende Äquivalenz

[ ˜ A ] = [?* - A ].

Was gilt für das Komplement des Alphabets?

? als RA-Symbol vs. ? als Kantenbeschriftung in EA  
Das ANY-Symbol ? steht als RA für die Sprache aller Zeichenketten der Länge 1.

Beispiel 5.2.11 ( ˜ A).

xfst[0]: read regex [~ A] ;  
xfst[1]: print net  
Sigma: ? A  
Size: 2.  
Flags: deterministic, pruned, minimized, epsilon_free  
Arity: 1  
fs0: ? -> fs1, A -> s2.  
fs1: ? -> fs1, A -> fs1.  
s2: ? -> fs1, A -> fs1.

pict

Im regulären Ausdruck ?*, der die universale Sprache bezeichnet, bedeutet das Fragezeichen nicht dasselbe wie als Kantenbeschriftung. Die Verwendung des gleichen Zeichens für unterschiedliche Zwecke mag verwirren. Die Funktion als Kantenbeschriftung und als regulärer Ausdruck lässt sich aber immer leicht unterscheiden.

Definition 5.2.12 (UNKNOWN-Symbol). Das UNKNOWN-Symbol ? an den Kantenübergängen von EA steht für diejenigen Symbole des Eingabealphabets, welche nicht explizit im xfst-Sigma aufgeführt sind, d.h. noch unbekannt sind.

Wozu kann es nützlich sein, das Alphabet nicht vollständig aufzählen zu müssen?

Operatoren für Enthalten-Sein 
Wenn der RA A die Sprache A über Σ bezeichnet, dann bezeichnet der RA

Beispiel 5.2.13.

Alle Wörter, welche mindestens ein ’ch’ enthalten, dem ein anderer Buchstabe als ’s’ vorangeht: [$ [ \s c h ]]

pict

Operator für Beschränkung via Kontext (restriction
Der RA [ A => L _ R ] (expression restriction) restringiert alle Vorkommen von Teilzeichenketten a aus A. Jedem a muss eine Zeichenkette aus L vorangehen und eine Zeichenkette aus R nachfolgen.

Beispiel 5.2.14. Die Sprache von [ a => b _ c ] umfasst das Wort back-to-back oder bc, aber nicht das Wort cab oder pack.

Schrittweise Definition von [ A => L _ R ]

define VorAKeinL [~[?* L]] A ?* ;

define NachAKeinR ?* A [~[R ?*]] ;

define WederVorAKeinLNochNachAKeinR ~VorAKeinL & ~NachAKeinR ;

Hinweis

Die Sprache des Restriktions-Ausdrucks schränkt nur diejenigen Zeichenketten ein, welche als Teilzeichenkette ein Wort a aus A enthalten.

Wortende verankern in der Kontext-Beschränkung  

Die Spezialmarkierung für Wortende

Die Kontexte in [ A => L _ R ] sind gegen Aussen implizit mit der universalen Sprache konkateniert: [ A => ?* L _ R ?*]. Die Spezialmarkierung .#. bedeutet in den Kontexten Verankerung am Wortende und verhindert so die implizite Verkettung. Im EA ist .#. nicht vorhanden, es kann aber wie ein Symbol in die RA eingefügt werden.

Beispiel 5.2.15 (Die Wirkung von .#.).

pict

[ a => l _ r ]

pict

[ a => l _ r .#. ]

Operator für Beschränkung des Kontexts (restriction
Der RA [ A <= L _ R ] (context restriction) erlaubt Kontexte aus L gefolgt von R nur, wenn dazwischen eine Teilzeichenketten a aus A vorkommt.

Beispiel 5.2.16. Die Sprache von [ a <= b _ c ] umfasst das Wort back-to-back oder cb, aber nicht das Wort bc oder bxc.

Hinweis

Der Operator [ A <=> L _ R ] vereinigt die Beschränkungen. A ist ausserhalb von L und R verboten (expression restriction) und der Kontext L _ R ist verboten, ausser ein String aus A steht dazwischen (context restriction).