summaryrefslogtreecommitdiff
path: root/JPratt/src/main/java/bjc/pratt/commands/impls/TernaryCommand.java
diff options
context:
space:
mode:
authorStudent <student@Administrators-iMac-2.local>2017-04-12 11:05:57 -0400
committerStudent <student@Administrators-iMac-2.local>2017-04-12 11:05:57 -0400
commit22c356cd411cf0fcc18d548291af26bc7588a3aa (patch)
tree4f24fdda182b358ca96aed2249bb4e8a19994747 /JPratt/src/main/java/bjc/pratt/commands/impls/TernaryCommand.java
parent2dc1b5dd145ab0e2b3e3df67f967a9c07ed6d303 (diff)
parentf394306a4b65a3328551f9f6b8d4abff8bfd5b27 (diff)
Merge branch 'master' of https://github.com/bculkin2442/JPratt.git
Diffstat (limited to 'JPratt/src/main/java/bjc/pratt/commands/impls/TernaryCommand.java')
-rw-r--r--JPratt/src/main/java/bjc/pratt/commands/impls/TernaryCommand.java78
1 files changed, 78 insertions, 0 deletions
diff --git a/JPratt/src/main/java/bjc/pratt/commands/impls/TernaryCommand.java b/JPratt/src/main/java/bjc/pratt/commands/impls/TernaryCommand.java
new file mode 100644
index 0000000..92355c0
--- /dev/null
+++ b/JPratt/src/main/java/bjc/pratt/commands/impls/TernaryCommand.java
@@ -0,0 +1,78 @@
+package bjc.pratt.commands.impls;
+
+import bjc.pratt.ParserContext;
+import bjc.pratt.blocks.ParseBlock;
+import bjc.pratt.commands.BinaryPostCommand;
+import bjc.pratt.tokens.Token;
+import bjc.utils.data.ITree;
+import bjc.utils.data.Tree;
+import bjc.utils.parserutils.ParserException;
+
+/**
+ * A ternary command, like C's ?:
+ *
+ * @author bjculkin
+ *
+ * @param <K>
+ * The key type of the tokens.
+ *
+ * @param <V>
+ * The value type of the tokens.
+ *
+ * @param <C>
+ * The state type of the parser.
+ */
+public class TernaryCommand<K, V, C> extends BinaryPostCommand<K, V, C> {
+ private final ParseBlock<K, V, C> innerBlck;
+
+ private final Token<K, V> mark;
+
+ private final boolean nonassoc;
+
+ /**
+ * Create a new ternary command.
+ *
+ * @param precedence
+ * The precedence of this operator.
+ *
+ * @param innerBlock
+ * The representation of the inner block of the
+ * expression.
+ *
+ * @param marker
+ * The token to use as the root of the AST node.
+ *
+ * @param isNonassoc
+ * Whether or not the conditional is associative.
+ */
+ public TernaryCommand(final int precedence, final ParseBlock<K, V, C> innerBlock, final Token<K, V> marker,
+ final boolean isNonassoc) {
+ super(precedence);
+
+ if (innerBlock == null)
+ throw new NullPointerException("Inner block must not be null");
+ else if (marker == null) throw new NullPointerException("Marker must not be null");
+
+ innerBlck = innerBlock;
+ mark = marker;
+ nonassoc = isNonassoc;
+ }
+
+ @Override
+ public ITree<Token<K, V>> denote(final ITree<Token<K, V>> operand, final Token<K, V> operator,
+ final ParserContext<K, V, C> ctx) throws ParserException {
+ final ITree<Token<K, V>> inner = innerBlck.parse(ctx);
+
+ final ITree<Token<K, V>> outer = ctx.parse.parseExpression(1 + leftBinding(), ctx.tokens, ctx.state,
+ false);
+
+ return new Tree<>(mark, inner, operand, outer);
+ }
+
+ @Override
+ public int nextBinding() {
+ if (nonassoc) return leftBinding() - 1;
+
+ return leftBinding();
+ }
+} \ No newline at end of file