1
3 package jminusminus;
4
5 import static jminusminus.CLConstants.*;
6
7
10
11 class JWhileStatement extends JStatement {
12
13
14 private JExpression condition;
15
16
17 private JStatement body;
18
19
30
31 public JWhileStatement(int line, JExpression condition, JStatement body) {
32 super(line);
33 this.condition = condition;
34 this.body = body;
35 }
36
37
45
46 public JWhileStatement analyze(Context context) {
47 condition.analyze(context);
48 condition.type().mustMatchExpected(line(), Type.BOOLEAN);
49 body.analyze(context);
50 return this;
51 }
52
53
60
61 public void codegen(CLEmitter output) {
62 String test = output.createLabel();
64 String out = output.createLabel();
65
66 output.addLabel(test);
69 condition.codegen(output, out, false);
70
71 body.codegen(output);
73
74 output.addBranchInstruction(GOTO, test);
76
77 output.addLabel(out);
79 }
80
81
84
85 public void writeToStdOut(PrettyPrinter p) {
86 p.printf("<JWhileStatement line=\"%d\">\n", line());
87 p.indentRight();
88 p.printf("<TestExpression>\n");
89 p.indentRight();
90 condition.writeToStdOut(p);
91 p.indentLeft();
92 p.printf("</TestExpression>\n");
93 p.printf("<Body>\n");
94 p.indentRight();
95 body.writeToStdOut(p);
96 p.indentLeft();
97 p.printf("</Body>\n");
98 p.indentLeft();
99 p.printf("</JWhileStatement>\n");
100 }
101
102 }
103