0

連結しようとしていますが、同時に解析しようとしています。私は今、a1 = "Hello" + "World" と言うことができ、A1 のセルで HelloWorld と言うことができるプログラムのような Excel を作成しています。追加記号を解析し、これら 2 つの単語を接続する方法を知る必要があるだけです。ランナーのように、これを理解するためにさらにコードが必要かどうか教えてください。

これは私の parseInput クラスです:

public class ParseInput {
    private static String inputs;
    static int col;
    private static int row;
    private static String operation;
    private static Value field;


    public static void parseInput(String input){
         //splits the input at each regular expression match. \w is used for letters and \d && \D for integers
        inputs = input;
        Scanner tokens = new Scanner(inputs);
        String none0 = tokens.next();
        @SuppressWarnings("unused")
        String none1 = tokens.next();
        operation = tokens.nextLine().substring(1);
        String[] holder =  new String[2];
        String regex = "(?<=[\\w&&\\D])(?=\\d)";   
        holder = none0.split(regex);
        row = Integer.parseInt(holder[1]);
        col = 0;
        int counter = -1;
        char temp = holder[0].charAt(0);
        char check = 'a';
        while(check <= temp){
            if(check == temp){
                col = counter +1;
            }
            counter++;
            check = (char) (check + 1);
        }
         System.out.println(col);
         System.out.println(row);
         System.out.println(operation);
         setField(Value.parseValue(operation));

         Spreadsheet.changeCell(row, col, field);

    }

    public static Value getField() {
        return field;
    }

    public static void setField(Value field) {
        ParseInput.field = field;
    }
}
4

6 に答える 6

2

Excel が受け入れるもののごく一部に入力を制限できない限り、これは実際にはかなり複雑な問題です。そうでない場合は、おそらくANTLRのようなものを調べたいと思うでしょう。ただし、上記の入力を想定すると、次のようなことを行う必要があります。

  1. 等号の文字列を s1 と s2 に分割します
  2. プラス記号の s2 を s3 と s4 に分割します。
  3. すべての文字列をトリムし、s3 と s4 を囲む引用符を削除します。
  4. s3 と s4 を連結し、s1 によってインデックス付けされたデータストアに割り当てます。

連結のニーズの複雑さに応じて、文字列連結または StringBuilder のいずれかを使用できます。

result = "" + s3 + s4; // string concatenation
result = new StringBuilder().append(s3).append(s4).toString(); // StringBuilder

上記の手順についてご不明な点がございましたら、お気軽にお問い合わせください。

上記 (1) の詳細は次のとおりinputですa1 = "Hello" + "World"

String[] strings = input.split("=");
String s1 = strings[0].trim(); // a1
String s2 = strings[1].trim(); // "Hello" + "World"

strings = s2.split("+");
String s3 = strings[0].trim().replaceAll("^\"", "").replaceAll("\"$", "") // Hello
String s4 = strings[1].trim().replaceAll("^\"", "").replaceAll("\"$", ""); // World
String field = s3 + s4;

String colString = s1.replaceAll("[\\d]", ""); // a
String rowString = s1.replaceAll("[\\D]", ""); // 1
int col = colString.charAt(0) - 'a'; // 0
int row = Integer.parseInt(rowString);

Spreadsheet.changeCell(row, col, field);
于 2012-04-09T03:00:21.910 に答える
1

JavaCCのようなパーサージェネレーターを使用してカスタム文法を実装することをお勧めします。

ここに簡単なチュートリアルがあります。

この方法で必要なすべての式を処理できるため、これがより良い解決策であると思います。

于 2012-04-09T03:02:19.113 に答える
0

Abdullahが言ったことに加えて、できる限り1オンスのメモリを本当に節約したい場合は、文字列連結の代わりにStringBuilderを使用する必要があります。StringBuilderがそれらすべてを単一の文字列に追加する間、String連結が各連結に対して新しい文字列オブジェクトを作成することを以前に読んだと思います。しかし、あまり重要ではありません。

于 2012-04-09T03:20:17.517 に答える
0

使用しているすべてのクラスを使用してもよろしいですか? 「a = b + c + d ..」のようなものを解析するには (検証しようとしていないと仮定して)、最も簡単でおそらく最も効率的な方法は、Java lang String で分割 APIを使用することです。

次に、StringBuilderを使用して必要なものを結合します

于 2012-04-09T03:01:20.880 に答える
0

パーサーとエバリュエーターを設計して実装する必要があります。その前に、パーサー/エバリュエーターが評価する言語を設計する必要があります。

どうやってするの。

  • あなたの言語が本当に単純な場合は、StringTokenizer のようなものを使用してトークン化を行い、手動で解析することで解決できます。

  • それ以外の場合は、JavaCC や ANTLR などの Java "パーサー ジェネレーター" の使用方法を学習することをお勧めします。

いずれにせよ、すべての用語を理解するには、背景を読む必要があります。ウィキペディアおよび/またはパーサー ジェネレーターの 1 つからのチュートリアル資料から始めることができます。あるいは、このトピックに関する優れた教科書があります。

于 2012-04-09T03:06:08.773 に答える
0

私の初期の人生で、私はあなたのスタイルで方程式評価器を作りました. Expression treesについて無知だったため、膨大なコードと複雑さが必要でした。しかし、これにより、ネイティブの JAVA コードを使用して、パーサーにより多くの機能を簡単に追加できるようになります。式ツリーの使用例がたくさんあります。

于 2012-04-09T03:35:10.480 に答える