1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.millscript.millscript.expr;
22
23 import org.millscript.millscript.action.WhileAction;
24 import org.millscript.millscript.vm.CompilerState;
25
26 /**
27 * This class implement the <code>while</code> loop syntax. The loop body
28 * expression will be evaluated repeatedly until the predicate expression
29 * evaluates to <code>false</code>.
30 *
31 * @see org.millscript.millscript.syntax.WhileSyntax
32 * @see WhileAction
33 */
34 public final class WhileExpr extends Expr< WhileAction > {
35
36 /**
37 * The predicate expression.
38 */
39 private final Expr< ? > predExpr;
40
41 /**
42 * The body expression.
43 */
44 private final Expr< ? > bodyExpr;
45
46 /**
47 * Creates a new while expression, with the specified predicate and body
48 * expressions.
49 *
50 * @param a the predicate expression, should return
51 * <code>true</code>/<code>false</code>
52 * @param b the body expression
53 */
54 public WhileExpr( final Expr< ? > a, final Expr< ? > b ) {
55 predExpr = CheckExpr.make( a );
56 bodyExpr = b;
57 }
58
59 /**
60 * @see org.millscript.millscript.expr.Expr#compileIt()
61 */
62 @Override
63 public WhileAction compileIt() {
64 return (
65 new WhileAction(
66 predExpr.compile(),
67 bodyExpr.compile()
68 )
69 );
70 }
71
72 /**
73 * @see org.millscript.millscript.expr.Expr#resolve(org.millscript.millscript.vm.CompilerState)
74 */
75 @Override
76 public void resolve( final CompilerState state ) {
77 this.predExpr.resolve( state );
78 this.bodyExpr.resolve( state );
79 }
80
81 /**
82 * @see org.millscript.millscript.expr.Expr#showComponents(int)
83 */
84 @Override
85 void showComponents( final int n ) {
86 this.predExpr.show( n );
87 this.bodyExpr.show( n );
88 }
89
90 }