3

整数、浮動小数点数、演算子、関数、変数、および括弧で構成される文字列をトークン化したいと思います。次の例は、問題の本質を明るくする必要があります。

現在の状態:

String infix = 4*x+5.2024*(Log(x,y)^z)-300.12

望ましい状態:

 String tokBuf[0]=4 
 String tokBuf[1]=* 
 String tokBuf[2]=x 
 String tokBuf[3]=+ 
 String tokBuf[4]=5.2024 
 String tokBuf[5]=* 
 String tokBuf[6]=( 
 String tokBuf[7]=Log
 String tokBuf[8]=( 
 String tokBuf[9]=x
 String tokBuf[10]=, 
 String tokBuf[11]=y 
 String tokBuf[12]=) 
 String tokBuf[13]=^ 
 String tokBuf[14]=z 
 String tokBuf[15]=) 
 String tokBuf[16]=- 
 String tokBuf[17]=300.12

すべてのヒントと解決策をいただければ幸いです。

4

2 に答える 2

7

Java ストリーム トークナイザーを使用します。インターフェイスは少し奇妙ですが、慣れると次のようになります。

http://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html

要求された文字列リストに解析するサンプル コード (おそらく、トークナイザーを直接使用するか、少なくともオブジェクト リストを使用して、数値を直接 Double として格納できるようにする必要があります):

public static List<String> tokenize(String s) throws IOException {
  StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(s));
  tokenizer.ordinaryChar('-');  // Don't parse minus as part of numbers.
  tokenizer.ordinaryChar('/');  // Don't treat slash as a comment start.
  List<String> tokBuf = new ArrayList<String>();
  while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
    switch(tokenizer.ttype) {
      case StreamTokenizer.TT_NUMBER:
        tokBuf.add(String.valueOf(tokenizer.nval));
        break;
      case StreamTokenizer.TT_WORD:
        tokBuf.add(tokenizer.sval);
        break;
      default:  // operator
        tokBuf.add(String.valueOf((char) tokenizer.ttype));
    }
  }
  return tokBuf; 
}

テスト走行:

System.out.println(tokenize("4*x+5.2024*(Log(x,y)^z)-300.12"));
[4.0, *, x, +, 5.2024, *, (, Log, (, x, ,, y, ), ^, z, ), -, 300.12]
于 2013-05-11T22:01:00.557 に答える
1

http://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form
http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools
アルゴリズムの例:
step#1 : '4' を読む=> 数値トークン => 非数値記号 (つまり ' * ') に到達するまで文字を読み取ります。最初に読み取った tokBuf[0] は数値トークンです。
step#2 : read '*' => トークンは二項演算子を表します。
ステップ#3:「x」を読み取ります。おそらく、関数シンボル => 次のトークンを var-token としてマークします。
等々。
次は評価ですね。逆ポーランド表記または構文ツリーが役立ちます...

于 2013-05-11T21:59:03.603 に答える