2017-10-03 3 views
1

私はStreamTokenizerというパーサーを作成しています。数値にcharが含まれているというエラーをエコーするには、"8a"のような入力が必要です。代わりに、それは印刷します空白なしの数字と文字を別々のトークンとして受け取るJava StreamTokenizer

NUM: 8 ID: a 

それには空白がそれらを分離していないにも関わらず、独立したトークンとして文字を識別しているようです。

回避策はありますか?

+3

現在の出力を生成するコードスニペットを追加できますか? –

+0

一般に、識別子**は数字で始まらないので、これはいくつかの問題を引き起こす可能性があります... –

+0

ここに私が解析しているコードがあります: { \t int s; \t if(z [1]≦8a) \t \t return z; \t一方、(R> Z) \t {IF(X == 2) \t \t \t戻りX。 \t} はここに私のコードは次のとおり スイッチ(トークン) \t {\t場合StreamTokenizer.TT_NUMBER: \t { \t \t \t \t文字列S = String.valueOf(st.nval)。 – moduluses

答えて

0

あなたは数文字の特別な処理を無効にするStringTokenizerparseNumbersメソッドをオーバーライドすることができます。 これは非常に危険であり、そうでなければ不適切であるかもしれないことにご注意ください。 javadocのhttps://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html#parseNumbers() 1として

* When the parser encounters a word token that has the format of a 
* double precision floating-point number, it treats the token as a 
* number rather than a word, by setting the {@code ttype} 
* field to the value {@code TT_NUMBER} and putting the numeric 
* value of the token into the {@code nval} field. 

ここでは例が来る - 私は数字に使用される典型的な文字に '数値' 属性を追加していないです:

final Reader rd = new StringReader("8a"); 
    final StreamTokenizer tk = new StreamTokenizer(rd) { 
     @Override 
     public void parseNumbers() { 
      // super.parseNumbers(); - by not calling super. I disable special handling of numeric characters 
     } 
    }; 

    tk.wordChars('a', 'z'); 
    tk.wordChars('0', '9'); 
    while ((tk.nextToken()) != StreamTokenizer.TT_EOF) { 
     if (tk.ttype == StreamTokenizer.TT_WORD) { 
      System.out.println("TT_WORD " + tk.sval); 
     } 
     if (tk.ttype == StreamTokenizer.TT_NUMBER) { 
      System.out.println("TT_NUMBER " + tk.nval); 
     } 
    } 

出力:

をTT_WORD 8a

上記の設定では、String8aを取得してから、String.containsを入力して数字が内部にあるかどうかを確認できます。

+0

これは私が考えていた方向です。私は数値に達するとそれを実装しなければならないかもしれませんが、チェックの後にトークナイザのパラメータをリセットしますが、それは私の目的のためにはうまくいくはずです。ありがとう! – moduluses

0

現在のトークンがStreamTokenizer.TT_WORDであるかどうかを確認し、エラーを出力できます。下のコードスニペットを確認すると、数字と文字をスペースなしで入力し、文字に達したときにエラーを出力します。

import java.io.*; 
public class StreamCharacterChecker{ 

    public static void main(String []args) throws IOException{ 
     String text = "123458a787"; 
     Reader r = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(text.getBytes()))); 
     StreamTokenizer st = new StreamTokenizer(r); 
     int token; 
     while ((token = st.nextToken()) != StreamTokenizer.TT_EOF){ 
      if (token == StreamTokenizer.TT_WORD){ 
       System.out.println("Error characters detected!"); 
       break; 
      }  
     } 
    } 
} 
+0

「a」を付けずにスニペットを試してみましたが、まだこのエラーが表示されています。 – moduluses

+0

申し訳ありませんが、状態を確認したところでエラーが発生しました。 –

+0

私は実際に!=前にキャッチして変更しました。まだ動作していなかったが、何とか今のように見える。それは動作します、ありがとう! – moduluses

関連する問題