summaryrefslogtreecommitdiff
path: root/JPratt/src/main/java/com/ashardalon/pratt/commands/impls/PreTernaryCommand.java
diff options
context:
space:
mode:
authorBenjamin Culkin <scorpress@gmail.com>2024-06-03 17:33:53 -0400
committerBenjamin Culkin <scorpress@gmail.com>2024-06-03 17:33:53 -0400
commit15a2b29e48f134bc93cfd0a3d8512001e9242f3d (patch)
treeb3f5c4c5f0e474479cd47ad0ac0f35770fc44881 /JPratt/src/main/java/com/ashardalon/pratt/commands/impls/PreTernaryCommand.java
parent39ba97edf49270715ec61bedb7d4a62ada819ba0 (diff)
Rename package to new domainHEADtrunk
Rename the package to the new domain
Diffstat (limited to 'JPratt/src/main/java/com/ashardalon/pratt/commands/impls/PreTernaryCommand.java')
-rw-r--r--JPratt/src/main/java/com/ashardalon/pratt/commands/impls/PreTernaryCommand.java85
1 files changed, 85 insertions, 0 deletions
diff --git a/JPratt/src/main/java/com/ashardalon/pratt/commands/impls/PreTernaryCommand.java b/JPratt/src/main/java/com/ashardalon/pratt/commands/impls/PreTernaryCommand.java
new file mode 100644
index 0000000..cd01333
--- /dev/null
+++ b/JPratt/src/main/java/com/ashardalon/pratt/commands/impls/PreTernaryCommand.java
@@ -0,0 +1,85 @@
+package com.ashardalon.pratt.commands.impls;
+
+import bjc.data.Tree;
+
+import com.ashardalon.pratt.ParserContext;
+import com.ashardalon.pratt.blocks.ParseBlock;
+import com.ashardalon.pratt.commands.AbstractInitialCommand;
+import com.ashardalon.pratt.commands.CommandResult;
+import com.ashardalon.pratt.commands.CommandResult.Status;
+import com.ashardalon.pratt.tokens.Token;
+
+import bjc.data.SimpleTree;
+import bjc.utils.parserutils.ParserException;
+
+/**
+ * A prefix ternary operator, like an if/then/else group.
+ *
+ * @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 PreTernaryCommand<K, V, C> extends AbstractInitialCommand<K, V, C> {
+ private final Token<K, V> trm;
+
+ private final ParseBlock<K, V, C> condBlock;
+
+ private final ParseBlock<K, V, C> opblock1;
+ private final ParseBlock<K, V, C> opblock2;
+
+ /**
+ * Create a new ternary statement.
+ *
+ * @param cond
+ * The block for handling the condition.
+ *
+ * @param op1
+ * The block for handling the first operator.
+ *
+ * @param op2
+ * The block for handling the second operator.
+ *
+ * @param term
+ * The token to use as the node for the AST.
+ */
+ public PreTernaryCommand(final ParseBlock<K, V, C> cond, final ParseBlock<K, V, C> op1,
+ final ParseBlock<K, V, C> op2, final Token<K, V> term) {
+ super();
+
+ if(cond == null)
+ throw new NullPointerException("Cond block must not be null");
+ else if(op1 == null)
+ throw new NullPointerException("Op block #1 must not be null");
+ else if(op2 == null) throw new NullPointerException("Op block #2 must not be null");
+
+ condBlock = cond;
+ opblock1 = op1;
+ opblock2 = op2;
+
+ trm = term;
+ }
+
+ @Override
+ protected CommandResult<K, V> intNullDenotation(final Token<K, V> operator, final ParserContext<K, V, C> ctx)
+ throws ParserException {
+ final CommandResult<K,V> condRes = condBlock.parse(ctx);
+ if (condRes.status != Status.SUCCESS) return condRes;
+ Tree<Token<K, V>> cond = condRes.success();
+
+ final CommandResult<K,V> op1Res = opblock1.parse(ctx);
+ if (op1Res.status != Status.SUCCESS) return op1Res;
+ Tree<Token<K, V>> op1 = op1Res.success();
+
+ final CommandResult<K,V> op2Res = opblock2.parse(ctx);
+ if (op2Res.status != Status.SUCCESS) return op2Res;
+ Tree<Token<K, V>> op2 = op2Res.success();
+ return CommandResult.success(new SimpleTree<>(trm, cond, op1, op2));
+ }
+} \ No newline at end of file