私はStreamTokenizer
というパーサーを作成しています。数値にcharが含まれているというエラーをエコーするには、"8a"
のような入力が必要です。代わりに、それは印刷します空白なしの数字と文字を別々のトークンとして受け取るJava StreamTokenizer
NUM: 8 ID: a
それには空白がそれらを分離していないにも関わらず、独立したトークンとして文字を識別しているようです。
回避策はありますか?
私はStreamTokenizer
というパーサーを作成しています。数値にcharが含まれているというエラーをエコーするには、"8a"
のような入力が必要です。代わりに、それは印刷します空白なしの数字と文字を別々のトークンとして受け取るJava StreamTokenizer
NUM: 8 ID: a
それには空白がそれらを分離していないにも関わらず、独立したトークンとして文字を識別しているようです。
回避策はありますか?
あなたは数文字の特別な処理を無効にするStringTokenizer
のparseNumbers
メソッドをオーバーライドすることができます。 これは非常に危険であり、そうでなければ不適切であるかもしれないことにご注意ください。 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
上記の設定では、String
8a
を取得してから、String.contains
を入力して数字が内部にあるかどうかを確認できます。
これは私が考えていた方向です。私は数値に達するとそれを実装しなければならないかもしれませんが、チェックの後にトークナイザのパラメータをリセットしますが、それは私の目的のためにはうまくいくはずです。ありがとう! – moduluses
現在のトークンが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;
}
}
}
}
現在の出力を生成するコードスニペットを追加できますか? –
一般に、識別子**は数字で始まらないので、これはいくつかの問題を引き起こす可能性があります... –
ここに私が解析しているコードがあります: { \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