2010-11-18 15 views
3

MSBuild条件パーサーを作成しようとしています。条件はhereと記載されています。単純なMSBuild条件パーサーの作成

だから私は正常に動作するように見える文法を作ってみた:

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 

これは私のニーズに合わせているようだと、私はこの単純な言語を定義するC++クラスのセットを作ってみました。つまり、私は上記のようにクラスを作成することができますし、私は基本的な文で "実行"を呼び出すことができ、私は反対側のブール値を取得します。 (!そしてコードの巨大なラインを許し;):以下、この言語の使用

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

は、以下のように定義されてしまう):次のように

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:\\")))); 

が、私は単純に、上記のステートメントを実行することができます:

const bool result = baseStatement.Run(); 

ここまではすべて問題ありません。私は文法を使って "言語"全体を表現することができ、文法を有効な完全な文にすることができます。

しかし、今私は次の問題があります。私は実際に文字列を解析する必要があります。私はこれについてどこから始めるべきか分かりません。誰も私が実際の文字列パーサを記述して元の文を上記のC++クラスのセットに構文解析する方法を教えてもらえますか?私はむしろこの正面で失われています。

私は自分の学習上の理由からこれをやっています。できるだけ他の人のパーサライブラリを使用したくありません。

ありがとうございます!

+0

あなたはこのことを理解しましたかなりの数の関連の質問がありますか?私は結果に興味があります。 –

答えて

1
+0

乾杯、私はuniで言語処理コースを勉強しましたが、それは13年前です... "再帰的な降下"のようなパーサーの名前については忘れてしまいました。それは私にどこかから見て始めることができます。私はまだ明らかにより明白な尻を開くために開いている:D – Goz

関連する問題