summaryrefslogtreecommitdiff
path: root/JPratt/src/main/java/bjc
diff options
context:
space:
mode:
Diffstat (limited to 'JPratt/src/main/java/bjc')
-rw-r--r--JPratt/src/main/java/bjc/pratt/blocks/ChainParseBlock.java79
-rw-r--r--JPratt/src/main/java/bjc/pratt/commands/BlockNonInitialCommand.java75
2 files changed, 79 insertions, 75 deletions
diff --git a/JPratt/src/main/java/bjc/pratt/blocks/ChainParseBlock.java b/JPratt/src/main/java/bjc/pratt/blocks/ChainParseBlock.java
new file mode 100644
index 0000000..1758c17
--- /dev/null
+++ b/JPratt/src/main/java/bjc/pratt/blocks/ChainParseBlock.java
@@ -0,0 +1,79 @@
+package bjc.pratt.blocks;
+
+import java.util.Set;
+
+import bjc.pratt.ParseBlock;
+import bjc.pratt.ParserContext;
+import bjc.pratt.Token;
+import bjc.utils.data.ITree;
+import bjc.utils.data.Tree;
+import bjc.utils.parserutils.ParserException;
+
+/**
+ * A {@link ParseBlock} for a series of parse blocks, linked by a set of tokens.
+ *
+ * Roughly analogous to Perl 6s list associative operators.
+ *
+ * @author bjculkin
+ *
+ * @param <K>
+ * The token key type.
+ *
+ * @param <V>
+ * The token value type.
+ *
+ * @param <C>
+ * The parser state type.
+ *
+ */
+public class ChainParseBlock<K, V, C> implements ParseBlock<K, V, C> {
+ private ParseBlock<K, V, C> iner;
+
+ private Set<K> indicators;
+
+ private Token<K, V> trm;
+
+ /**
+ * Create a new chain parser block.
+ *
+ * @param inner
+ * The block for the chains interior.
+ *
+ * @param chainIndicators
+ * The set of markers that indicate continuing the chain
+ *
+ * @param term
+ * The node in the AST for the expression.
+ */
+ public ChainParseBlock(ParseBlock<K, V, C> inner, Set<K> chainIndicators, Token<K, V> term) {
+ iner = inner;
+ indicators = chainIndicators;
+ trm = term;
+ }
+
+ @Override
+ public ITree<Token<K, V>> parse(ParserContext<K, V, C> ctx) throws ParserException {
+ ITree<Token<K, V>> expression = iner.parse(ctx);
+
+ Token<K, V> currentToken = ctx.tokens.current();
+ if (indicators.contains(currentToken.getKey())) {
+ ITree<Token<K, V>> res = new Tree<>(trm);
+ res.addChild(expression);
+
+ while (indicators.contains(currentToken.getKey())) {
+ res.addChild(new Tree<>(currentToken));
+ ctx.tokens.next();
+
+ ITree<Token<K, V>> innerExpression = iner.parse(ctx);
+ res.addChild(innerExpression);
+
+ currentToken = ctx.tokens.current();
+ }
+
+ return res;
+ }
+
+ return expression;
+ }
+
+}
diff --git a/JPratt/src/main/java/bjc/pratt/commands/BlockNonInitialCommand.java b/JPratt/src/main/java/bjc/pratt/commands/BlockNonInitialCommand.java
deleted file mode 100644
index c361c73..0000000
--- a/JPratt/src/main/java/bjc/pratt/commands/BlockNonInitialCommand.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package bjc.pratt.commands;
-
-import bjc.pratt.NonInitialCommand;
-import bjc.pratt.ParseBlock;
-import bjc.pratt.ParserContext;
-import bjc.pratt.Token;
-import bjc.utils.data.ITree;
-import bjc.utils.data.Tree;
-import bjc.utils.parserutils.ParserException;
-
-/**
- * A non-initial command that delegates all of the work to a {@link ParseBlock}
- *
- * @author bjculkin
- *
- * @param <K>
- * The token key type.
- *
- * @param <V>
- * The token value type.
- *
- * @param <C>
- * The parser state type.
- */
-public class BlockNonInitialCommand<K, V, C> extends NonInitialCommand<K, V, C> {
- private final ParseBlock<K, V, C> innr;
-
- private final int lftBind;
- private final int nxtBind;
-
- private final Token<K, V> trm;
-
- /**
- * Create a new non-initial command that delegates to a parse block.
- *
- * @param inner
- * The parse block to delegate to.
- *
- * @param leftBind
- * The left binding power (precedence).
- *
- * @param rightBind
- * The right binding power (associativity control).
- *
- * @param term
- * The token to use as the node in the AST.
- */
- public BlockNonInitialCommand(final ParseBlock<K, V, C> inner, final int leftBind, final int rightBind,
- final Token<K, V> term) {
- innr = inner;
-
- lftBind = leftBind;
- nxtBind = rightBind;
-
- trm = term;
- }
-
- @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>> expression = innr.parse(ctx);
-
- return new Tree<>(trm, expression);
- }
-
- @Override
- public int leftBinding() {
- return lftBind;
- }
-
- @Override
- public int nextBinding() {
- return nxtBind;
- }
-} \ No newline at end of file