[英]InputStreamReader .read() doesn't read / skips the first character?
我正在嘗試編寫一個簡單的復數計算器,它可以計算以下表達式:
編輯:我注意到第一個前瞻讀取是 10 而不是 40('(') 的 ascii 值。我該如何解決這個問題?next() 方法也不能正常工作(lookahead = tokenizer.nextToken();)
我的代碼:
import java.io.*;
import static java.util.Objects.requireNonNull;
public class Parser {
private int lookahead;
private StreamTokenizer tokenizer;
private final Reader input;
private final Writer output;
public Parser(Reader input, Writer output) throws IOException {
this.input = requireNonNull(input);
this.output = requireNonNull(output);
this.lookahead = this.input.read();
}
private void next() throws IOException {
lookahead = tokenizer.nextToken();
}
private void match(int expected) throws IOException {
if (lookahead != expected) {
switch(expected) {
case '(':
System.out.println("Error, missing opening round bracket.");
break;
case ')':
System.out.println("Error, missing closing round bracket.");
break;
case 'i':
System.out.println("Error, missing i");
break;
case '+':
System.out.println("Error, missing +");
default:
return;
}
} else {
next();
}
}
private void parseExpr() throws IOException {
long[] parameters = new long[4];
int i = 0;
if (lookahead == '(') {
match('(');
if (lookahead == StreamTokenizer.TT_NUMBER) {
parameters[i] = lookahead;
i++;
next();
} else {
System.out.println("Not a number.");
return;
}
match('+');
if (lookahead == StreamTokenizer.TT_NUMBER) {
parameters[i] = lookahead;
i++;
next();
} else {
System.out.println("Not a number.");
return;
}
match('i');
match(')');
if(lookahead == '+'){
next();
parseExpr();
System.out.println("(" + (parameters[0]+parameters[2]) + "+" +(parameters[1]+parameters[3]) + "i)");
}
if(lookahead == '-'){
next();
parseExpr();
System.out.println("(" + (parameters[0]-parameters[2]) + "+" +(parameters[1]-parameters[3]) + "i)");
}
}
System.out.println("Sorry, I can't help you");
}
public static void main(String[] args) throws IOException {
InputStreamReader reader = new InputStreamReader(System.in);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream);
Parser parse = new Parser(reader, writer);
parse.parseExpr();
writer.close(); // Close and flush output stream writer.
String output = outputStream.toString();
System.out.println("Output generated by parser: " + output);
}
}
但它總是輸出“對不起,我幫不了你”。
我已經測試了你的代碼,我有兩條評論可以幫助你:
tokenizer = new StreamTokenizer( reader );
在主要方法中。我希望這有幫助,讓我知道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.