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.syntax;
22
23 import org.millscript.millscript.alert.Alerts;
24 import org.millscript.millscript.expr.ApplyExpr;
25 import org.millscript.millscript.expr.CommaExpr;
26 import org.millscript.millscript.expr.Expr;
27 import org.millscript.millscript.expr.InitExpr;
28 import org.millscript.millscript.expr.NameExpr;
29
30 /**
31 * This class implements <code>init</code> syntax.
32 *
33 * <p>
34 * <code>init <expr></code>
35 * </p>
36 *
37 * <p>
38 * This type of expression is only valid inside a class initialiser function.
39 * The right hand side expression must be an apply expression, which is
40 * applying a parent class initialiser. It only makes sense to be able to call
41 * an initialiser for each class once, i.e. you can't call different
42 * initialisers for the same parent class inside a given initialiser.
43 * </p>
44 *
45 * @see org.millscript.millscript.expr.InitExpr
46 */
47 public final class InitSyntax extends PrefixSyntax {
48
49 /**
50 * @see org.millscript.millscript.syntax.PrefixSyntaxInterface#prefix(java.lang.String, org.millscript.millscript.syntax.Parser)
51 */
52 @Override
53 public InitExpr prefix( final String sym, final Parser parser ) {
54
55
56 final boolean thisWasSpecified = parser.peekRead( "^" );
57
58 final Expr initExpr = parser.readExpr();
59
60 if ( initExpr instanceof ApplyExpr ) {
61 final ApplyExpr ae = (ApplyExpr) initExpr;
62
63 if ( thisWasSpecified ) {
64 return new InitExpr( ae.getFun(), ae.getArgs() );
65 } else {
66
67 return new InitExpr( ae.getFun(), new CommaExpr( ae.getArgs(), new NameExpr( "this" ) ) );
68 }
69 } else {
70 throw(
71 Alerts.parse(
72 "Unexpected expression after 'init'",
73 "'init' must be followed by a class initialiser application"
74 ).mishap()
75 );
76 }
77 }
78
79 }