2010-11-18 11 views
3

Ich versuche, einen MSBuild-Bedingungsparser zu schreiben. Die Bedingungen sind beschrieben here.Schreiben eines einfachen MSBuild-Bedingungsparsers

Also mit einer Grammatik kommt Ich habe das gut zu funktionieren scheint:

S -> !S 
S -> S == S 
S -> S != S 
S -> S && S 
S -> S || S 
S -> Fn(str) 
S -> str == str 
S -> str != str 
S -> n < n 
S -> n <= n 
S -> n > n 
S -> n >= n 

Dies scheint meine Bedürfnisse anzupassen, und ich habe mit einer Reihe von C++ Klassen kommen, die diese einfache Sprache zu definieren. Dh ich kann die Klassen so erstellen, dass sie oben passen und dann kann ich "run" auf der Basisanweisung aufrufen und ich bekomme einen booleschen Wert vom anderen Ende. (! Die große Codezeile Und vergib;):

Statement baseStatement(new StatementOrStatement(new StatementAndStatement(new NotStatement(new ExistsFunctionStatement("C:\\Config.sys")), new NumberLessThanNumberStatement(14.0, 17.0)), new StatementAndStatement(new StringEqualStringStatement("AString", "AString2"), new HasTrailingSlashFunctionStatement("C:\\")))); 

ich einfach kann die obige Aussage wie folgt durchgeführt:

diese Sprache die folgende Verwendung)

(!Exists("C:\\config.sys") && 14 < 17) || (AString == AString2 && HasTrailingSlash("C:")) 

wird definiert als

const bool result = baseStatement.Run(); 

So weit ist alles in Ordnung. Es scheint, dass ich die ganze "Sprache" mit meiner Grammatik darstellen kann und ich kann die Grammatik zu einer gültigen vollständigen Aussage machen.

Aber jetzt habe ich das nächste Problem. Ich muss die Saite analysieren. Ich habe keine Ahnung, wo ich anfangen soll. Kann mir jemand helfen, wie ich den eigentlichen String-Parser schreibe, um die ursprüngliche Anweisung in die obigen C++ - Klassen zu zerlegen? Ich bin an dieser Front ziemlich verloren.

Ich mache das rein aus meinen eigenen Lerngründen, so weit wie möglich möchte ich nicht die Parser-Bibliothek eines anderen verwenden.

Vielen Dank im Voraus!

+0

Haben Sie jemals herausgefunden? Ich würde mich für die Ergebnisse interessieren. –

Antwort

1
+0

Prost, ich habe einen Sprachprozessor-Kurs an der Uni studiert ... aber das war vor 13 Jahren ... Ich hatte Namen für Parser wie "Recursive Descent" ganz vergessen. Das gibt mir einen Ort, von dem aus ich anfangen kann. Ich bin immer noch offen für mehr explizite Kicks in den Arsch obwohl: D – Goz