2009-03-05 7 views
0

Ich mache eine Anwendung, wo ich die Syntax jeder Zeile, die einen Befehl mit einem Schlüsselwort als erstes Wort enthält, überprüfen muss.
Wenn die Syntax korrekt ist, muss ich auch den Typ der Variablen überprüfen, die in den Schlüsselwörtern verwendet werden.Parser mit RegEx und XML, in C#

Wie, wenn es ein Druckbefehl:

print "string" < variable < "some another string" //some comments 

    print\s".*"((\s?<\s?".*")*\s?<\s?(?'string1'\w+))?(\s*//.*)? 

Also habe ich die folgende Regex:

\s*[<>]\s*((?'variant'\w+)(\[\d+\])*) 

Dies ist alle Worte in Variantengruppe für den Zugriff auf die Variablen zu extrahieren und ihre Art überprüfen .
So hat mein Werkzeug viele Schlüsselwörter und zurzeit schreibe ich grob für jedes Schlüsselwort Regex. Und wenn morgen eine Veränderung stattfindet, würde ich die jeweilige Änderung immer und überall in jedem Keyword ersetzen.
Ich speichere eine Regex für jedes Schlüsselwort in einer XML-Datei. Allerdings war ich interessiert es erweiterbar zu machen, wo die Spezifikationsänderungen sagen morgen also muss ich es nur einmal ändern, und es wäre in allen Orten etwas zu reflektieren, wie ich den Druck regex zu verwandeln: wie diese

print %string% (%<% %string%|%variable%)* %comments% 

Jetzt Ich schreibe eine Spezifikation für jedes Schlüsselwort und schreibe die Definition von String, Variable, Kommentare in eine andere Datei, die ihre Regex speichert. Dann schreibe ich einen Parser, der diese Zeichenfolge analysiert und eine Regex-Zeichenfolge für mich erstellt.

Ist das möglich?

Gibt es einen besseren Weg dies zu tun oder gibt es eine Möglichkeit, dies in XML zu tun?

Antwort

0

Ich habe eine Idee und machte meinen eigenen Ersatz. Ich habe% myname% art von Tags verwendet, um meinen regulären Ausdruck zu definieren, und ich habe die Definition von% myname% -Tags einzeln mit regex geschrieben. Dann scannte ich die Zeichenfolge rekursiv und konvertierte das Auftreten von% myname% -Tags in die Spezifikation, die sie hatten. Es hat meine Arbeit getan. Danke,