我试图编写一个简单的复数计算器,可以计算以下表达式:
编辑:我注意到第一次前瞻读取是10而不是40(ascii值 '(' ) . 我如何解决这个问题?
我的代码:
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)
在主方法中
我希望这有帮助,让我知道。
这里是我的源代码:
问题内容: 我正在尝试使用javax.smartcardio 读取智能卡(德语Gesundheitskarte) 在EF“ PD” 的定义中,其长度指定为850字节。内容应该是一个gzip压缩的ISO5589-15编码的XML字符串作为指定在这里 作为CommandAPDU,我发送 获取前256个字节。发送后 我得到下一个256个字节。 但是我如何得到其余的呢? 我怎么知道二进制数据何时结束? 德
在 Mule 4 中,我正在读取一个大型 csv 文件进行转换,需要将内容写入数据库表。csv 文件没有标头。当我默认运行集成时,第一行被跳过,就好像默认值被预先确定为标题一样。 我看了一下应用程序类型。xml,看起来头被设置为false,如下所示 任何建议都将不胜感激。谢谢
在 Lisp 表达式的一生中,有三个最重要的时刻,分别是读取期(read-time),编译期(compile-time) 和运行期(runtime)。运行期由函数左右。宏给了我们在编译期对程序做转换的机会。本章讨论读取宏(read-macro),它们在读取期发挥作用。 17.1 宏字符 按照 Lisp 的一般哲学,你可以在很大程度上控制 reader 。它的行为是由那些可随时改变的属性和变量控制的
问题内容: 我有一个笨拙的csv文件,我需要跳过第一行来阅读它。 我正在使用python / pandas轻松做到这一点 但是我不知道如何在Go中做到这一点。 错误: : 问题答案: 读取csv文件时跳过第一行 例如, 输出:
使用poi读取某些excel失败,遇到此错误 从,存在