Basisklassen

Klasse Parser

Die Klasse Parser dient als Basisklasse für alle Parser und Übersetzer. Eine von Parser abgeleitete Klasse muss die Funktion startSymbol implementieren. Die Funktion compile der Klasse Parser übersetzt einen String, indem sie die Funktion startSymbol der abgeleiteten Klasse aufruft.

 

<?php
class Parser
{
    protected $ALPHA="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    protected $DIGIT="0123456789";
    protected $errormessage;
    protected $errorposition;
    public $inputstring;

    public function compile($t)
    {
        $this->inputstring=$t;
        $len=strlen($t);
        $result="";
        $this->errormessage="ok";
        $this->errorposition=0;
        try
        {
            $result=$this->startSymbol();
            if (!$this->isEmpty())
                throw new Exception("Zu viele Zeichen: $this->inputstring");
        }
        catch (Exception $e)
        {
            $this->errormessage=$e->getMessage();
            $this->errorposition=strlen($this->inputstring);
        }
        $this->errorposition=$len-$this->errorposition;
        return $result;
    }

    public function getErrorMessage()
    {
        return $this->errormessage;
    }

    public function getErrorPosition()
    {
        return $this->errorposition;
    }

    // Liefert die ersten k Zeichen des Eingabestrings
    protected function lookahead($k=1)
    {
        if (strlen($this->inputstring)>=$k)
            return substr($this->inputstring, 0, $k);   // die ersten k Zeichen
        return "";
    }

    // Liefert true, wenn der Eingabestring mit String a beginnt
    protected function comes($a)
    {
        return !$this->isEmpty() && strpos($this->inputstring, $a)===0;
    }

    // Löscht k Zeichen am Anfang des Eingabestrings
    protected function consume($k=1)
    {
        $this->inputstring=substr($this->inputstring, $k);
    }

    // Liefert das nächste Zeichen des Eingabestrings und arbeitet es ab
    protected function symbol()
    {
        $s=$this->lookahead();
        $this->consume();
        return $s;
    }

    // Liefert a, wenn der Eingabestring mit a beginnt
    // und arbeitet dann String a am Anfang der Eingabe ab;
    // liefert anderenfalls "" und tut nichts
    protected function trymatch($a)
    {
        if ($this->comes($a))
        {
            $this->consume(strlen($a));
            return $a;
        }
        return "";
    }

    // Wenn der Eingabestring mit a beginnt, wird
    // String a am Anfang der Eingabe abgearbeitet,
    // anderenfalls wird eine Exception ausgelöst
    protected function match($a)
    {
        if ($this->trymatch($a))
            return $a;
        else
            throw new Exception("Symbol $a erwartet");
    }

    // Liefert true, falls Eingabestring aufgebraucht ist
    protected function isEmpty()
    {
        return strlen($this->inputstring)==0;
    }

    // Liefert true, falls String a ein Buchstabe ist
    protected function isLetter($a)
    {
        return strpos($this->ALPHA, $a)!==false;
    }

    // Liefert true, falls String a eine Ziffer ist
    protected function isDigit($a)
    {
        return strpos($this->DIGIT, $a)!==false;
    }

    // Liefert true, falls String a ein Zeilenumbruch ist
    protected function isCRLF($a)
    {
        return strpos("\r\n", $a)!==false;
    }

    // Liefert true, falls der Eingabestring mit einem Buchstaben beginnt
    protected function comesLetter()
    {
        return !$this->isEmpty() && $this->isLetter($this->lookahead());
    }

    // Liefert true, falls der Eingabestring mit einer Ziffer beginnt
    protected function comesDigit()
    {
        return !$this->isEmpty() && $this->isDigit($this->lookahead());
    }

    // Liefert true, falls der Eingabestring mit einem Zeilenumbruch beginnt
    protected function comesCRLF()
    {
        return !$this->isEmpty() && $this->isCRLF($this->lookahead());
    }

    // Arbeitet Leerzeichen ab
    protected function ignorespaces()
    {
        while ($this->comes(" "))
            $this->consume();
        return " ";
    }

    // Arbeitet Zeilenumbrüche ab
    protected function ignoreCRLFs()
    {
        while ($this->comesCRLF())
            $this->consume();
    }

    protected function ignoreBlanks()
    {
        while ($this->comes(" ") || $this->comesCRLF())
            $this->consume();
        return " ";
    }

}
?>

 

[up]

 


H.W. Lang   mail@hwlang.de   Impressum   Datenschutz
Created: 06.11.2008   Updated: 19.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden