Laden...

Extended Backus-Naur-Form (EBNF)-Parser

Erstellt von Th69 vor 11 Jahren Letzter Beitrag vor 11 Jahren 6.287 Views
Th69 Themenstarter:in
4.931 Beiträge seit 2008
vor 11 Jahren
Extended Backus-Naur-Form (EBNF)-Parser

Beschreibung:

Nachdem ich vor kurzem für Boyer-Moore-Horspool Suche (und weitere) meine alten C-Sourcen hervorgeholt hatte, habe ich dabei noch ein weiteres Projekt aus meiner Schatztruhe gefunden, welches ich nun auch nach C# portiert habe.

Der Extended Backus-Naur-Form (EBNF)-Parser vergleicht anhand einer gegebenen EBNF-Definition eine Datei auf syntaktische Korrektheit.

In meinem angehängten Projekt habe ich als Beispiele EBNF-Definitionen sowie ein paar Beispieldateien für die Sprache "C" als auch für ein "Extended Win-Ini"-Format eingefügt.

Es ist bisher ein reines Konsolenprojekt - der EBNF-Parser läßt sich aber auch für jedes andere Projekt nutzen, da ich alle Konsolenausgaben konsequent in die Program.cs verbannt habe (im Gegensatz noch zu dem original C-Source, welcher sich unter "EP.c" findet).

Ein Beispielaufruf wäre:


EBNF-Parser ..\..\EP-Defs\ExWinIni.def ..\..\EP-Defs\Test.ini

Sofern die "Test.ini" korrekt ist, sollte "File '....\EP-Defs\Test.ini' is correct!" ausgegeben werden, ansonsten eine entsprechende Fehlermeldung mit Positionsangabe (sofern möglich).

Bei Aufruf des EBNF-Parser ohne Parameter wird eine kurze Beschreibung angezeigt:


EBNF-Parser(EP) (c)1994/2012 by Th69
Usage: EP deffile sourcefile

Extended Backus-Naur-Form:
NonTerminal '=' { NonTerminal | Terminal } '.'
- NonTerminal: String aus ('a'-'z'|'A'-'Z'|'_')
  a|b : Alternative
  (a) : Gruppenklammer
  [a] : Optionsklammer
  {a} : Wiederholungsklammer
- Terminal:
  "string": ASCII-String (nur druckbare Zeichen)
  'a'     : einzelnes ASCII-Zeichen
- Extensions by Th69:
  \code   : 0-255 für nicht-druckbare Zeichen
  <a>     : a{a} mindestens einmal
  'a'-'z' : 'a'|...|'z' alternative ASCII-Zeichen
  \c1-\c2 : \c1|...|\c2 (wie oben)

(Ich verwende also sogar noch einige eigene nützliche Erweiterungen.)

Der Source-Code selbst ist sicherlich kein Meisterwerk objektorientierter Kunst (oder dergleichen), zeigt aber schön, was man mithilfe von Parsertechniken alles programmieren kann 😉.

Der alte C Code hat komplett mithilfe von FILE-Handles direkt auf den Dateien operiert - für C# lese ich die EBNF-Definitionsdatei einmalig in ein Dictionary ein und habe dafür dann die Klasse "StringStream" erzeugt, um lesend auf die einzelnen Definitionen der sog. "NonTerminals" zuzugreifen (erst hatte ich einen StreamReader verwendet, dieser unterstützt jedoch kein Auslesen der aktuellen Leseposition sowie Neupositionierung).

Ich hoffe natürlich, daß ich bei der Konvertierung keine großen Fehler eingebaut habe.

Vllt. kann ich hiermit den ein oder anderen für mein Lieblingsthema "Parser" begeistern (mein Parser für mathematische Formeln hat ja auch bisher guten Anklang hier gefunden).

EBNF, Parser, Extended Backus-Naur-Form, BNF, Backus-Naur-Form