diff options
| author | Benjamin Culkin <scorpress@gmail.com> | 2024-06-03 17:33:53 -0400 |
|---|---|---|
| committer | Benjamin Culkin <scorpress@gmail.com> | 2024-06-03 17:33:53 -0400 |
| commit | 15a2b29e48f134bc93cfd0a3d8512001e9242f3d (patch) | |
| tree | b3f5c4c5f0e474479cd47ad0ac0f35770fc44881 /JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java | |
| parent | 39ba97edf49270715ec61bedb7d4a62ada819ba0 (diff) | |
Rename the package to the new domain
Diffstat (limited to 'JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java')
| -rw-r--r-- | JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java b/JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java new file mode 100644 index 0000000..1aeabdb --- /dev/null +++ b/JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java @@ -0,0 +1,63 @@ +package com.ashardalon.pratt.blocks; + +import java.util.function.UnaryOperator; + +import com.ashardalon.pratt.ParserContext; +import com.ashardalon.pratt.commands.CommandResult; +import com.ashardalon.pratt.commands.CommandResult.Status; + +import bjc.utils.parserutils.ParserException; + +/** + * A parse block that can adjust the state before handling its context. + * + * @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 TriggeredParseBlock<K, V, C> implements ParseBlock<K, V, C> { + private final UnaryOperator<C> onEntr; + private final UnaryOperator<C> onExt; + + private final ParseBlock<K, V, C> sourc; + + /** + * Create a new triggered parse block. + * + * @param onEnter + * The action to fire before parsing the block. + * + * @param onExit + * The action to fire after parsing the block. + * + * @param source + * The block to use for parsing. + */ + public TriggeredParseBlock(final UnaryOperator<C> onEnter, final UnaryOperator<C> onExit, + final ParseBlock<K, V, C> source) { + onEntr = onEnter; + onExt = onExit; + sourc = source; + } + + @Override + public CommandResult<K, V> parse(final ParserContext<K, V, C> ctx) throws ParserException { + final C newState = onEntr.apply(ctx.state); + + final ParserContext<K, V, C> newCtx = new ParserContext<>(ctx.tokens, ctx.parse, newState); + + final CommandResult<K,V> res = sourc.parse(newCtx); + + if (res.status != Status.SUCCESS) return res; + + ctx.state = onExt.apply(newState); + + return res; + } + +} |
