Übung 6:

  1. Die grundlegenden regulären Ausdrücke sind gleichwertig mit Automaten, die eine entsprechende Eingabe akzeptieren. Zeichnen Sie einen deterministischen endlichen Automaten für die folgenden regulären Ausdrücke:
    hallo
    h[ae]llo
    abc|def
    ab*c
    ab+c
    a(bc)?fg
    a(bc|de)?fg
    int\s+main\s*\(\s*void\s*\)
    Hinweis: Sie können eine Zeichenfolge in Anführungszeichen an einen Zustandsübergang schreiben, statt für jedes Zeichen einen expliziten Übergang zu verwenden. Alternativen können mit Komma getrennt am selben Übergang stehen. Die Übergänge in den Fehlerzustand können Sie weglassen. (Wenn es keinen Übergang für die Eingabe gibt, wechselt der Automat implizit in den Fehlerzustand.)
  2. Erarbeiten Sie einen regulären Ausdruck für Dezimalzahlen, wie sie in C erlaubt sind.
    Hinweis: Der in der Vorlesung gezeigte Ausdruck [1-9][0-9]* ist ungeeignet, weil er kein Suffix erlaubt. In C99 ist als Suffix ein kleines oder großes u für unsigned, ein kleines oder großes l für long und zwei kleine oder große l für long long möglich. u und eine der long-Angaben dürfen in beliebiger Reihenfolge kombiniert werden.
  3. Erarbeiten Sie einen regulären Ausdruck für dezimale Fließkommazahlen, wie sie in C erlaubt sind. Dabei muß ein Exponent angegeben werden, wenn kein Dezimalpunkt in der Zahl vorkommt; andernfalls ist der Exponent optional; er darf ein Vorzeichen haben. Vor oder nach dem Punkt muß mindestens eine Ziffer stehen. Kleines und großes f oder l (für float bzw. long double) sind als Suffix erlaubt.
    Hinweise:
  4. Suchen Sie mittels regulären Ausdrücken markante Stellen in einem Quelltext, z.B. die Funktion main, Präprozessoranweisungen, Zuweisungen in runden Klammern und das (wahrscheinliche) Ende einer Funktion. Machen Sie das in einem Editor, der reguläre Ausdrücke unterstützt, und testweise auch mit grep mit der Option "-C 5", um fünf Zeilen Kontext angezeigt zu bekommen (damit Sie prüfen können, ob Sie wirklich die erwartete Stelle gefunden haben).