5

私は Java から C# へのコードの移植に取り組んでおり、JAVA コードの一部はトークナイザーを使用していますが、Java の stringtokenizer から得られる配列にも区切り記号 (この場合は +、-、/、*) があることを理解しています。 、(、)) をトークンとして。C# の Split() 関数を使用しようとしましたが、セパレータ自体が削除されているようです。最後に、これは文字列を解析し、計算として実行します。私は多くの調査を行ってきましたが、このトピックに関する参考文献は見つかりませんでした。

実際のセパレーターを検出された順序で分割配列に入れる方法を知っている人はいますか?

トークン化のコード:

public CalcLexer(String s)
{
    char[] seps = {'\t','\n','\r','+','-','*','/','(',')'};
    tokens = s.Split(seps);
    advance();
}

テスト:

static void Main(string[] args)
    {
        CalcLexer myCalc = new CalcLexer("24+3");
        Console.ReadLine();
    }

「24+3」は次の出力になります: 「24」、「3」 「24」、「+」、「3」の出力を探しています

完全開示の性質上、このプロジェクトはクラス課題の一部であり、次の完全なソース コードを使用します。

http://www.webber-labs.com/mpl/source%20code/Chapter%20Seventeen/CalcParser.java.txt http://www.webber-labs.com/mpl/source%20code/Chapter%20Seventeen/CalcLexer .java.txt

4

3 に答える 3

11

Regex.Splitゼロ幅アサーションで使用できます。たとえば、次は で分割され+-*/ます。

Regex.Split(str, @"(?=[-+*/])|(?<=[-+*/])");

事実上、これは次のように述べてい-+*/ます。

于 2009-07-15T22:04:38.550 に答える
4

これにより、出力が生成されます。

string s = "24+3";
string seps = @"(\t)|(\n)|(\+)|(-)|(\*)|(/)|(\()|(\))";
string[] tokens = System.Text.RegularExpressions.Regex.Split(s, seps);

foreach (string token in tokens)
    Console.WriteLine(token);
于 2009-07-15T22:08:51.693 に答える
1

非常に柔軟で、強力で、信頼性が高く、拡張可能なソリューションが必要な場合は、 ANTLR の C# ポートを使用できます。初期のオーバーヘッド (リンクは VS2008 のセットアップ情報)があり、このような小さなプロジェクトではやり過ぎになる可能性があります。変数をサポートする電卓の例を次に示します

クラスにとってはやり過ぎかもしれませんが、この種の現実世界の問題に対する「実際の」解決策について学ぶことに興味がある場合は、ご覧ください。grammars を操作するための Visual Studio パッケージもあります。または、 ANTLRWorksを個別に使用することもできます。

于 2009-07-15T22:02:34.827 に答える