Philipp Hasenfratz: EBNF Parser

Halihallo Forumer

kennt vielleicht jemand (oder gibt's überhaupt etwas derartiges?) einen EBNF Parser, welcher einen Inputstream durch eine EBNF-Spezifizierung in eine XML-Datei oder einen anderen Datentyp parsed?
Ein Perlprogramm/-modul wäre mir sehr lieb, bei Suchdiensten habe ich nix derartiges gefunden.

Ich werde vielleicht eine primitive Script-sprache entwerfen müssen, um gewisse Dinge zu automatisieren. Die Script-sprache wird durch EBNF definiert und dann über Perl interpretiert.

Thoretisch sollte es doch möglich sein, die durch EBNF definierten Daten mit einigen Regular Expressions einzulesen und durch ein OO-Interface zu strukturieren (dass der Perl-Interpreter diese rekursiv abarbeiten/interpretieren/auflösen kann), oder? - Kennt jeman einen derartigen EBNF-Parser? - Zumindest etwas ähnliches...

Viele Grüsse

Philipp

  1. Hallo,

    also wenn ich Deinen Text richtig verstanden hab, dann möchtest Du folgendes tun:
    Du möchtest eine Skriptsprache entwerfen. Die Definition dieser Sprache liegt in EBNF vor. Und Du brauchst ein Tool was die EBNF-Definitionen einlesen und zum parsen verwenden kann?
    Ein solches Tool ist mir zumindst für Perl nicht bekannt. Was Du gebrauchen könntest wäre Yacc. Das ist ein Tool was aus einer Sprachdefinition ein Parser generiert. Diesen Parser kannst Du dann verwenden, um darauf Dein Interpreter aufzubauen. Ein Parser macht ja erstmal nix anderes als ein Datenstrom in eine passende "verarbeitbare" Repräsentation des ganzem im Computer zu erstellen. Wie Du das dann interpretierst ist Deine Sache und muss auch von Dir programmiert werden. Da läßt sich nicht viel automatisieren.
    Was Du mit dem Perl willst, hab ich noch nicht ganz verstanden. Ich denke Du willst Perl Benutzen und darin den Parser/Interpreter zu schreiben. Dann würde Yacc schon fast wieder herausfallen weil dieser C-Code erzeugt.
    Erwähnenswert sind in diesem Zusammen noch Lex (lexikalische analyse) und Bison.

    Siehe dazu auch: http://www.buva.sowi.uni-bamberg.de/lehre/inf2/material/skript/node1.html

    Gruss
       MichaelB

    1. Halihallo Michael

      Du möchtest eine Skriptsprache entwerfen. Die Definition dieser Sprache liegt in EBNF vor. Und Du brauchst ein Tool was die EBNF-Definitionen einlesen und zum parsen verwenden kann?

      Du hast richtig verstanden :-)

      Ein solches Tool ist mir zumindst für Perl nicht bekannt. Was Du gebrauchen könntest wäre Yacc. Das ist ein Tool was aus einer Sprachdefinition ein Parser generiert. Diesen Parser kannst Du dann verwenden, um darauf Dein Interpreter aufzubauen. Ein Parser macht ja erstmal nix anderes als ein Datenstrom in eine passende "verarbeitbare" Repräsentation des ganzem im Computer zu erstellen.

      Klar. Genau das möchte ich eigentlich. Der EBNF-Parser soll mir den Sourcecode des Scriptes in einer "computer-freundliche" - Struktur umwandeln (z. B. XML oder eine verschachtelte objektorientierte Struktur; oder eben einen Source generieren, der mit dem perl/C Interpreter/Compiler ausgeführt werden kann).

      Wie Du das dann interpretierst ist Deine Sache und muss auch von Dir programmiert werden. Da läßt sich nicht viel automatisieren.

      Wenn's anders wäre, müsste ich ja keinen EBNF-Parser haben :-)

      Was Du mit dem Perl willst, hab ich noch nicht ganz verstanden. Ich denke Du willst Perl Benutzen und darin den Parser/Interpreter zu schreiben. Dann würde Yacc schon fast wieder herausfallen weil dieser C-Code erzeugt.

      Ein Parser soll mir ein Script in ein "einfaches, leicht zu verarbeitendes" Datenschema abbilden, welches ich dann mit Perl einlesen kann und verarbeiten kann. z. B.

      program bla;

      procedure hello_world {
         print "good news, the parser works"
      }

      soll in folgenden Datentyp abgebildet werden:

      Data::Dumper
      ------------
      $VAR1 = {
         program => {
            name => 'bla'
            procedure => {
               name => 'hello_world',
               code => {
                  print => 'good news, the parser works'
               }
            }
         }
      }

      oder so ähnlich...

      Erwähnenswert sind in diesem Zusammen noch Lex (lexikalische analyse) und Bison.

      Vielen Dank für die beiden Tipps (Lex und Yacc), ich werde mir die Programme mal ansehen. Auch wenn sie für mein "Problem" vielleicht nicht taugen sollten, werden sie mir wahrscheinlich trotzdem irgendwie helfen (z. B. um einen eigenen, einfachen Parser zu schreiben, welcher speziell für die Script-Syntax geschaffen ist).

      Vielen Dank für deine Hilfe

      Philipp

      1. Halihallo nochmals

        Vielen Dank für die beiden Tipps (Lex und Yacc), ich werde mir die Programme mal ansehen. Auch wenn sie für mein "Problem" vielleicht nicht taugen sollten, werden sie mir wahrscheinlich trotzdem irgendwie helfen (z. B. um einen eigenen, einfachen Parser zu schreiben, welcher speziell für die Script-Syntax geschaffen ist).

        hab ich mir doch gedacht. Dein Link war sehr treffend und bietet mir genau den Lesestoff, den ich mir erhofft hatte.

        Und noch einiges mehr:
        http://www.luv.asn.au/overheads/lex_yacc/
        http://aspn.activestate.com/ASPN/CodeDoc/ParseLex/doc/Lex.fr.html

        es gibt sogar ein Perl-Modul zum Thema Lex :-)
        juhuiii... Ich werd mich mal dazu informieren.

        Vielen Dank nochmals

        Philipp