Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnisproblem bei Regeldefinition

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Verständnisproblem bei Regeldefinition

    Moin,

    folgende Problemstellung kurz erläutert:

    Ich schreibe momentan einen Parser und möchte in einer Klasse ein bestimmtes Regelset definieren, welches sich aus der BNF (Backus Nauer Form) zusammensetzt.

    Einfacher gesagt: Die BNF Grammatik die ich schon erstellt habe (in BNF schreibweise) möchte ich jetzt in PHP Code umwandeln, um so die Grammatikregeln in einer Klasse festzuhalten.

    Später wird der Parser einen bestimmten Ausdruck (in Form eines Strings) gegen diese Regeln prüfen.

    Mein Problem besteht jetzt darin, die BNF Notation in PHP Code zu bekommen, hier ein Beispiel einer BNF Notation:

    Code:
    <ausdruck> ::= <zeichen> | <zeichen> <zeichenfolge> | [<zeichen>] [<zeichenfolge>] <irgendein_feld>
    
    <irgendein_feld> ::= <zeichen> | <zeichen> <zeichenfolge>
    <zeichen> ::= a | b | c | d | e | f | g | h | i | j | k | [.......]
    <zeichenfolge> ::= <zeichen> | <zeichen> <zeichenfolge>
    Das liest sich wie folgt:

    Ein "Ausdruck" besteht aus einem einzelnen Zeichen ODER einem einzelnen Zeichen gefolgt von einer Zeichenfolge ODER einem definierten Feld (was in den eckigen Klammern steht sind immer Alternativen die vorkommen "können", nicht müssen".

    Wer sich bisschen mit Grammatiken und der BNF beschäftigt hat der wirds verstehen, was hier definiert wird. Es gibt auch den bekannten Bison Parser Generator, der aus solchen BNF Grammatiken (natürlich dann in eigener Bison Syntax definiert) einen Parser für die vorgegebene Grammatik erstellt.

    Kurzum, ich baue einen eigenen Parser in sehr simpler Form.

    Wie bekomme ich nun die formalen Grammatikregeln in PHP Code? Ich hänge grad an dem Problem, wie ich z.B. den "Ausdruck" definiere.

    Mir schwebt sowas hier vor:

    PHP-Code:
    public static $ausdruck self::$zeichen || (self::$zeichen && self::$zeichenfolge) || self::$irgendein_feld 
    Auf den einzelnen Teilen des Ausdrucks bauen dann, wie in der BNF Notation, die weiteren Definitionen auf.

    Also, nochmals: Wie bekomme ich eine solche Regel in PHP notiert, so dass ich mit meinem Parser einen Ausdruck gegen diese Regel prüfen kann?

    Ich hoffe es ist verständlich, was ich mit all dem meine!


    Gruss

    ne0h

  • #2
    So einfach ist das nicht. Ein Parser besteht normalerweise aus mehreren Teilen. Dazu gehören der Lexer der einen Text in einzelne Tokens zerteilt und dann der Parser selbst der die entsprechenden Tokens verarbeitet und auf Fehler prüft (Syntax, Regeln).

    Dazu lies dir am besten mal kurz Parser – Wikipedia durch. Und dann am besten mal ein paar Beispiele für einfache Parser suchen, da kannst du dir dann anschauen wie sowas umgesetzt wird. Aber ganz so einfach ist es nicht.

    Kommentar


    • #3
      Hi,

      Danke ich hab mich da schon seit einiger Zeit durchgelesen. Wie gesagt, mir gehts erstmal um die syntaktische Notation in PHP, um einen Ausdruck grammatikalisch festzuhalten. Ich hab das Ganze auch schon in einer anderen Sprache programmiert und dort ist es lauffähig, nur leider nutze ich da eine externe Bibliothek zum Parsen, ich setze das jetzt nach PHP um nur in sehr viel einfacherer Form.

      Gruss

      Kommentar


      • #4
        Vielleicht taugt das hier was: LIME Parser generator for PHP | Get LIME Parser generator for PHP at SourceForge.net

        (Comparison of parser generators - Wikipedia, the free encyclopedia)

        Wie hast du das denn in der "anderen Sprache" notiert?

        Edit: Das Beispiel im lime-Download sieht relativ gut aus.

        Kommentar


        • #5
          geht es dir darum den Parser selbst schreiben zu wollen oder brauchst du was fertiges?

          PHP_ParserGenerator (Lemon)

          PHP_Parser

          Falls du den Quelltext einfach nur zerlegen willst, kann dir dabei bereits [MAN]http://php.net/manual/de/book.tokenizer.php[/MAN] helfen
          DevBlog|3D Online-Shopping|Xatrium

          Kommentar

          Lädt...
          X