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.expr.ApplyExpr;
24 import org.millscript.millscript.expr.CommaExpr;
25 import org.millscript.millscript.expr.Expr;
26 import org.millscript.millscript.expr.NameExpr;
27
28 /**
29 * This class represents infix syntax, a variant of postfix syntax. This is used
30 * in situations where the syntax sits 'in'-between its arguments and maps to a
31 * function call. The syntax follows the form:
32 *
33 * <p>
34 * <code><expr> S <expr></code>
35 * </p>
36 *
37 * <p>
38 * which is very similar to the {@link SimplePostfixSyntax}, but it maps to a
39 * function call(actually an {@link ApplyExpr}). e.g. it's almost the equivalent
40 * of writing:
41 * </p>
42 *
43 * <p>
44 * <code>S( <expr>, <expr> )</code>
45 * </p>
46 *
47 * <p>
48 * To implement a new piece of infix syntax simply requires that you create a
49 * new function and map it to the relevant symbol in the {@link Parser}.
50 * </p>
51 *
52 * @see ApplyExpr
53 */
54 public class InfixSyntax extends PostfixSyntax {
55
56 /**
57 * @see org.millscript.millscript.syntax.PostfixSyntaxInterface#postfix(java.lang.String, int, org.millscript.millscript.expr.Expr, org.millscript.millscript.syntax.Parser)
58 */
59 @Override
60 public ApplyExpr postfix( final String sym, final int prec, final Expr lhs, final Parser parser ) {
61 Expr rhs = parser.readExprPrec( prec );
62 return (
63 new ApplyExpr(
64 new NameExpr( sym ),
65 CommaExpr.make( lhs, rhs )
66 )
67 );
68 }
69
70 }