我在课堂上遇到这个奇怪的错误。我有这个IRNode类,其中有3个字符串:op1,op2和op3。当我打印出来时,在将它们分配给不同的字符串然后打印出来之前,它们给出了不同的值。它存储为空。
输出的打印语句是这样的:
OP1: 20, OP2: a, OP3: null
;STOREI
而应该是:
OP1: 20, OP2: a, OP3: null
;STOREI 20 a
我的代码:
public IRNode (String op, String o1, String o2, String o3) {
opcode = op;
op1 = o1;
op2 = o2;
op3 = o3;
//IRNodeNext = null;
}
public void printIR () {
System.out.format("OP1: %s, OP2: %s, OP3: %s\n",op1, op2,op3);
String o1 = this.op1;
String o2 = this.op2;
String o3 = this.op3;
System.out.print(";"+opcode);
if (o1 != null) System.out.format(" ",o1);
if (o2 != null) System.out.format(" ",o2);
if (o3 != null) System.out.format(" ",o3);
System.out.format("\n");
}
PS。这是给我的编译器项目的。这是在我创建AST和IRNode列表之后。
*****编辑******
实际上发现这是一个愚蠢的错误。但是我现在面临另一个奇怪的错误。
op1 = thisNode.returnOP1();
op2 = thisNode.returnOP2();
op3 = thisNode.returnOP3();
在这里,我像之前一样得到op1,op2和op3。返回时,我检查了返回正确的值。
例如,
对于STOREI 20 a
我返回op1 = 20和op2 = a
但是当我刚收到那三行代码之后,就收到了错误的值。我得到op1 = 20,op2 = $ s,op3 = a
为什么会这样呢?
最佳答案
我在此示例中看到的唯一问题是:
if (o1 != null) System.out.format(" ",o1);
这些行中的每一行都应在空字符串中包含
%s
:if (o1 != null) System.out.format(" %s",o1);
if (o2 != null) System.out.format(" %s",o2);
if (o3 != null) System.out.format(" %s",o3);
没有它,您将不会打印任何内容。
输出:
OP1: 20, OP2: a, OP3: null
;STOREI 20 a
您可能还需要考虑以下几点:
System.out.format("%n");
不要在格式化的字符串中使用
\n
作为换行符,而不必使用%n
。它与平台无关。*****编辑******实际上发现这是一个愚蠢的错误。但是我现在面临另一个奇怪的错误。
op1 = thisNode.returnOP1(); op2 = thisNode.returnOP2(); op3 =
thisNode.returnOP3();在这里,我像之前一样得到op1,op2和op3。什么时候
返回,我检查了,我返回的是正确的值。例如,
对于STOREI 20 a,我将返回op1 = 20和op2 = a
但是当我刚收到那三行代码后,我就是
获取错误的值。我得到op1 = 20,op2 = $ s,op3 = a
为什么会这样呢?
没有您的
returnOP
方法的代码,这很难说,但是基于上一个问题,我愿意打赌这个问题是相似的。鉴于这种:
public String returnOP1() { return op1; }
public String returnOP2() { return op2; }
public String returnOP3() { return op3; }
和这个:
System.out.println(irNode.returnOP1());
System.out.println(irNode.returnOP2());
System.out.println(irNode.returnOP3());
我得到这个:
20
a
null
这告诉我,对您而言,编写
returnOP2()
来返回$s
而不是op2
或op2
被设置为$s
,并且编写returnOP3()
来返回op2
。但是,如果没有代码,就无法确定。