3

コマンドと引数を含むテキストのブロックを入力として、1 行に 1 つずつ、次のように入力します。

XYZ ARG1,ARG2,ARG3,...,ARGN

そして、引数XYZがその特定のコマンドに対して正しい形式であることを確認し、正しい場合は正しいコード ブロックを実行したいと考えています。~100 のコマンドのようなものがあり、その中には引数の数が可変で、関係が異なるものがあります (つまり、コマンドXYZが呼び出された場合は、コマンドも呼び出す必要がありABCます)。

次のようなコマンドもあります。

COMMAND
XYZ ARG1
BEF ARG1 ARG2
ENDCOMMAND

テキストが と の中に含まれていることが重要COMMANDですENDCOMMAND

通常、このようなものには、正規表現ではなく Lex と Yacc を使用しますが、より現代的なものはありますか? コードは C# で記述されています。古い学校の C Lex と Yacc 以外に、これを行う MSDN はありますか?

4

6 に答える 6

5

Lex/Yacc に代わるものを探している場合は、ANTLRをチェックしてください。C# を含むさまざまな言語でのコード生成をサポートしています。

于 2009-05-06T22:28:14.277 に答える
4

ANTLRは字句解析と解析の両方を処理でき、C# を生成できます (Java、C++、Python に加えて)。非常に成熟しており、多くのドキュメントと多くの例があります。また、YACC よりも優れたエラー メッセージを生成します。

于 2009-05-06T22:29:27.050 に答える
1

このような単純な構文解析の問題については、再帰降下パーサーを作成できます。もちろん、あなたの言語は比較的固定されており、完全なプログラミング言語には成長しないと仮定します。その危険性がある場合は、弾丸を噛んでANTLRまたは同等のものを使用してください.

于 2009-05-11T06:41:37.703 に答える
1

「年齢」よりも大きな問題があります。有名な C っぽいコンパイラー コンパイラーが C# で動作するかどうかはわかりません。同じことが、Boost の新しい解析テンプレートにも当てはまります。

おそらく、 GrammaticaSpartなどの難解なものを使用する必要があるでしょう( Google のヒット曲トップ 2 を選ぶため) 。

編集: もう少し調べてみると、ANTLRは C# をサポートしているようです。ANTLR は非常によく知られており、LEX/YACC よりも新しいので、チェックすることをお勧めします。

于 2009-05-06T22:19:46.403 に答える
1

C# と Java にリターゲットされた jay, yacc を見てください。mono プロジェクトに含まれています。

http://code.google.com/p/jayc/

于 2009-06-26T09:41:11.380 に答える
0

つまり、.NET Framework には特別なものはありません。

一見すると、コマンド構造は比較的単純に見えるため、ここでは手動解析が適していて、ほとんどの場合、高速なソリューションです。これにより、構文の有効性だけでなく、コマンド引数の実際の値が正しいかどうかを確認することもできます。

于 2009-05-06T22:25:21.180 に答える