Basisklassen

Klasse Parser

 aufwärts

Die abstrakte Klasse Parser dient als Basisklasse für alle Parser und Übersetzer.

 

/** Basisklasse für einen Parser oder Übersetzer
 */
public abstract class Parser
{
    protected static final String LOWER="abcdefghijklmnopqrstuvwxyz";
    protected static final String UPPER="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    protected static final String ALPHA=LOWER+UPPER;
    protected static final String DIGIT="0123456789";
    protected String inputstring;
    protected String errormessage;
    protected int errorposition;

    /** Aufruf des Startsymbols; muss in der
     *  abgeleiteten Klasse implementiert werden
     */
    protected abstract Object compileStartSymbol();

    /** Übernimmt einen Eingabestring und ruft das
     *  Startsymbol der Grammatik auf; erzeugt ggf.
     *  Fehlermeldung und Position des Fehlers im
     *  Eingabestring; liefert die Übersetzung des
     *  Eingabestrings zurück.
     */
    public Object compile(String t)
    {
        inputstring=t;
        Object r=null;    // result
        int len=inputstring.length();
        errormessage="ok";
        errorposition=0;
        try
        {
            r=compileStartSymbol();
            if (inputstring.length()>0)
                throw new RuntimeException("Zuviele Zeichen:"+inputstring);
        }
        catch (RuntimeException e)
        {
            errormessage=e.getMessage();
            errorposition=len-inputstring.length();
        }
        return r;
    }

    public String getErrorMessage()
    {
        return errormessage;
    }

    public int getErrorPosition()
    {
        return errorposition;
    }

    /** Liefert die ersten k Zeichen des Eingabewortes
     */
    protected String lookahead(int k)
    {
        if (inputstring.length()>=k)
            return inputstring.substring(0,k);    // die ersten k Zeichen
        return "";
    }

    /** Liefert das erste Zeichen des Eingabewortes
     */
    protected String lookahead()
    {
        return lookahead(1);    // das erste Zeichen
    }

    /** Liefert true, wenn das Eingabewort mit String a beginnt
     */
    protected boolean comes(String a)
    {
        return inputstring.startsWith(a);     // a ist Präfix
    }

    /** Löscht k Zeichen am Anfang des Eingabewortes
     */
    protected void consume(int k)
    {
        inputstring=inputstring.substring(k);    // erste k Zeichen werden konsumiert
    }

    /** Löscht String a am Anfang des Eingabewortes
     */
    protected void consume(String a)
    {
        consume(a.length());    // Präfix a wird konsumiert
    }

    /** Löscht das Eingabewort bis zum Zeichen s
     */
    protected void consumeUntil(String s)
    {
        while (!comes(s))
            consume(1);
    }

    /** Liefert true, wenn das Eingabewort leer ist
     */
    protected boolean isEmpty()
    {
        return inputstring.length()==0;
    }

    /** Liefert true, wenn das Eingabewort mit String a beginnt
     *  und löscht dann String a am Anfang des Eingabewortes.
     *  Liefert anderenfalls false und tut nichts.
     */
    protected boolean trymatch(String a)
    {
        if (comes(a))
        {
            consume(a);
            return true;
        }
        return false;
    }

    /** Wenn das Eingabewort mit String a beginnt, wird
     *  String a am Anfang des Eingabewortes gelöscht.
     *  Anderenfalls wird eine Exception ausgelöst.
     */
    protected void match(String a)
    {
        if (!trymatch(a))
            throw new RuntimeException("Zeichen "+a+" erwartet");
    }

    /** Liefert das nächste Zeichen und arbeitet es ab
     */
    protected String symbol()
    {
        String s=lookahead();
        consume(1);
        return s;
    }

    /** Liefert true, falls String a in String set vorkommt
     */
    protected boolean isIn(String a, String set)
    {
        if (a.length()>0)
            return set.indexOf(a)>=0;
        return false;
    }

    /** Liefert true, falls String a ein Buchstabe ist
     */
    protected boolean isLetter(String a)
    {
        return isIn(a, ALPHA);
    }

    /** Liefert true, falls String a eine Ziffer ist
     */
    protected boolean isDigit(String a)
    {
        return isIn(a, DIGIT);
    }

    /** Liefert true, falls das Eingabewort mit einem Buchstaben beginnt
     */
    protected boolean comesLetter()
    {
        return isLetter(lookahead());
    }

    /** Liefert true, falls das Eingabewort mit einer Ziffer beginnt
     */
    protected boolean comesDigit()
    {
        return isDigit(lookahead());
    }

    /** Liefert den Wert einer Ziffer
     */
    protected int digit()
    {
        return Integer.parseInt(symbol());
    }
    
    /** Arbeitet Leerzeichen und Zeilenvorschübe ab
     */
    protected void ignoreBlanks()
    {
        while (comes(" ") || comes("\r") || comes("\n"))
            consume(1);
    }

}    // end class Parser

 

up

 

homeH.W. Lang   Hochschule Flensburg   lang@hs-flensburg.de   Impressum   Datenschutz   ©   Created: 06.11.2008   Updated: 17.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