Parser und Übersetzer

Übersetzer für Additions-/Subtraktions-Ausdrücke

 aufwärts

Bei der syntax­gesteuerten Übersetzung wird von einem Parser ausgegangen. Zu jeder Parser-Funktion, die einer Variablen der Grammatik entspricht, werden geeignete Übersetzungs­aktionen hinzugefügt. Das Ergebnis ist eine Compiler-Funktion; diese liefert das Ergebnis der Übersetzung als Rückgabewert.

Im Folgenden wird dieses Vorgehen an einem konkreten Beispiel erläutert.

Recursive-Descent-Übersetzung von Ausdrücken

Wir nehmen den Parser für Additions-/Subtraktions-Ausdrücke als Grundlage, um nunmehr die eingegebenen Ausdrücke nicht nur zu parsen, sondern syntax­gesteuert in ihren Wert zu übersetzen. Zum Beispiel liefert der Ausdruck "9-3-4" als Ergebnis den Wert 2.

Hierzu wird die Klasse SimpleExpressionParser in eine Klasse SimpleExpressionCompiler umgeschrieben. Jede Funktion, die einer Variablen der Grammatik entspricht, liefert nun einen Wert zurück. Dieser Wert wird durch Übersetzungs­aktionen in der Implementierung der Funktion gebildet.

Die Klasse SimpleExpressionCompiler wird von der abstrakten Basisklasse Compiler abgeleitet. Die Additions-/Subtraktions-Ausdrücke liefern Werte vom Typ Integer zurück, daher wird Integer als Typ-Parameter für die Basisklasse Compiler angegeben.

public class SimpleExpressionCompiler extends Compiler<Integer>
{
    // Startsymbol ist expr
    @Override
    protected Integer startSymbol()
    {
        return expr();
    }

    // expr -> number (+ number | - number)*
    private Integer expr()
    {
        Integer v=number();
        while (comesAnyOf("+-"))
            if (comes("+"))
            {
                match("+");
                v+=number();
            }
            else if (comes("-"))
            {
                match("-");
                v-=number();
            }
        return v;
    }

    // number -> 0 | 1 | ... | 9
    private Integer number()
    {
        if (comesDigit())
            return Integer.parseInt(getSymbol());
        else
            throw new RuntimeException("Ziffer erwartet");
    }

    // Test
    public static void main(String[] args)
    {
        Compiler<Integer> p=new SimpleExpressionCompiler();
        String x="9-5-8+4";
        Integer r=p.compile(x);
        System.out.println(x);
        System.out.println(p.errorPointer());
        System.out.println(p.errormessage);
        System.out.println("Ergebnis: "+r);
    }

}    // end class SimpleExpressionCompiler

Zusammenfassung

Ein syntax­gesteuerter Recursive-Descent-Übersetzer ergibt sich aus einem ent­sprechenden Parser. In jeder Funktion, die einer Variablen der Grammatik entspricht, werden geeignete Übersetzungs­aktionen hinzugefügt. Diese Übersetzungs­aktionen errechnen den Wert, den die Funktion zurückgibt.

Eine allgemeine, formale Vorgehens­weise für die Konstruktion von Compiler-Funktionen, die Variablen der Grammatik entsprechen, ist unter Recursive-Descent-Übersetzung angegeben.

 

Weiter mit:   up

 

homeH.W. Lang   Hochschule Flensburg   lang@hs-flensburg.de   Impressum   Datenschutz   ©   Created: 02.12.2011   Updated: 10.06.2018
Valid HTML 4.01 Transitional

Hochschule Flensburg
Campus Flensburg

Informatik in Flensburg studieren...

 

Neu gestaltetes Studienangebot:

Bachelor-Studiengang
Angewandte Informatik

mit Schwerpunkten auf den Themen Software, Web, Mobile, Security und Usability.

Ihr Abschluss
nach 7 Semestern:
Bachelor of Science

 

Ebenfalls ganz neu:

Master-Studiengang
Angewandte Informatik

Ein projektorientiertes Studium auf höchstem Niveau mit den Schwerpunkten Internet-Sicherheit, Mobile Computing und Human-Computer Interaction.

Ihr Abschluss
nach 3 Semestern:
Master of Science

 

Weitere Informatik-Studienangebote an der Hochschule Flensburg:

Medieninformatik

Wirtschaftsinformatik