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.Expr;
24
25 /**
26 * The PostfixSyntaxInterface interface should be implemented by any class which
27 * provides a piece of postfix syntax. Postfix syntax is that which specifically
28 * follows the expression it operates on, but it may also preceed an additional
29 * expression. e.g. explode syntax vs. append syntax.
30 *
31 * <p>
32 * Postfix syntax also has the concept of precedence, which allows the parser to
33 * utomatically glue syntax together. e.g. in the following:
34 * <code>
35 * x := arg.func + 7;
36 * </code>
37 * means assign the result of adding 7 to the result of calling
38 * <code>func</code> with argument <code>arg</code> to variable <code>x</code>.
39 * The parser can automatically interpret this becuase <code>.</code> has a
40 * higher precedence than <code>+</code>, which in turn has a higher precedence
41 * than <code>:=</code>.
42 * </p>
43 */
44 public interface PostfixSyntaxInterface {
45
46 /**
47 * Returns the precedence of this piece of postfix syntax. Higher values
48 * represent more tightly bound syntax.
49 *
50 * @return the precedence of this postfix syntax
51 */
52 int getPrecedence();
53
54 /**
55 * Parse the syntax for the specified symbol, using the specified
56 * <code>Parser</code>. The symbol is specified because different symbols
57 * may share the same syntax, but result in slightly different expressions.
58 * The <code>Parser</code> is supplied as the source to parse from. As this
59 * is postfix syntax, we are also supplied the expression on the left hand
60 * side of the symbol along with the current precedence we should parse to.
61 *
62 * @param sym the symbol to parse this syntax for
63 * @param prec the current precedence we should parse to
64 * @param lhs the expression on the left hand side of the specified
65 * symbol
66 * @param parser Parser to parse from, i.e. the source to parse from
67 * @return an expression for this syntax
68 */
69 Expr postfix( final String sym, final int prec, final Expr lhs, final Parser parser );
70
71 }