Compilerbau

Hinweis: Im Themengebiet der Theoretischen Informatik (meist abkürzend als Automaten bezeichnet) wird nur im LK auch der Bau eines Compilers behandelt.

Obwohl beim Compilerbau zur Beschreibung formaler Sprachen wie z.B. Programmiersprachen meist kontextfreie Sprachen eingesetzt werden, wird für das Zentralabitur lediglich verlangt, einen Parser für eine reguläre Sprache entwickeln zu können.

An dieser Stelle werden wir einen einfachen Parser entwickeln, der genau die Sprache akzeptiert, die auch der folgende Endliche Automat akzeptiert:

Die schrittweise Umsetzung nummeriert die Zustände durch und repräsentiert sie als fortlaufende int-Zahlen. Da die Eingaben Ziffern sind, kann die Eingabe ganz einfach Buchstabe für Buchstabe verarbeitet werden. Jeder Zustandswechsel findet sich in einer der geschachtelten switch-Anweisungen wieder. (Bemerkung: Die switch-Anweisungen werden lediglich verwendet, weil sie eine übersichtliche Lösung ermöglichen. Analog können selbstverständlich auch geschachtelte if-else-Anweisungen zum Einsatz kommen.)

public class Automat {

    public boolean parse(String wort) {

        int zustand = 0; // Startzustand
        int zaehler = 0; // Beginn beim 0-ten Symbol

        while (zaehler < wort.length()) {

            char symbol = wort.charAt(zaehler); // aktuelles Symbol

            switch (zustand) {
                case 0: { switch (symbol) {
                            case '0': { zustand = 1; break; }
                            case '1': { zustand = 0; break; }
                          }
                          break;
                        }
                case 1: { switch (symbol) {
                            case '0': { zustand = 2; break; }
                            case '1': { zustand = 0; break; }
                          }                          
                          break;
                        }
                case 2: { switch (symbol) {
                            case '0': { zustand = 3; break; }
                            case '1': { zustand = 0; break; }
                          }                          
                          break;
                        }
                case 3: { switch (symbol) {
                            case '0': { zustand = 3; break; }
                            case '1': { zustand = 0; break; }
                          }                          
                          break;
                        }
            }

            zaehler = zaehler + 1; // naechstes Symbol

        }

        if (zustand==3) { return true; } // Endzustand?
        else { return false; }

    }

}

results matching ""

    No results matching ""