From 0f6565687e03968abd2e508fa8183f50f04f1cc7 Mon Sep 17 00:00:00 2001 From: bjculkin Date: Fri, 24 Mar 2017 16:21:07 -0400 Subject: Update Pratt Parser --- .../pratt/commands/DelimitedCommand.java | 65 ++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DelimitedCommand.java (limited to 'BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DelimitedCommand.java') diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DelimitedCommand.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DelimitedCommand.java new file mode 100644 index 0000000..090b2f4 --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/commands/DelimitedCommand.java @@ -0,0 +1,65 @@ +package bjc.utils.parserutils.pratt.commands; + +import bjc.utils.data.ITree; +import bjc.utils.data.Tree; +import bjc.utils.funcdata.FunctionalList; +import bjc.utils.funcdata.IList; +import bjc.utils.parserutils.ParserException; +import bjc.utils.parserutils.pratt.ParserContext; +import bjc.utils.parserutils.pratt.Token; + +import java.util.function.UnaryOperator; + +public class DelimitedCommand extends AbstractInitialCommand { + private int inner; + + private K delim; + private K mark; + + private Token term; + + private UnaryOperator onEnter; + private UnaryOperator onDelim; + private UnaryOperator onExit; + + private boolean statement; + + public DelimitedCommand(int inner, K delim, K mark, Token term, UnaryOperator onEnter, + UnaryOperator onDelim, UnaryOperator onExit, boolean statement) { + this.inner = inner; + this.delim = delim; + this.mark = mark; + this.term = term; + this.onEnter = onEnter; + this.onDelim = onDelim; + this.onExit = onExit; + this.statement = statement; + } + + @SuppressWarnings("unchecked") + @Override + protected ITree> intNullDenotation(Token operator, ParserContext ctx) + throws ParserException { + C newState = onEnter.apply(ctx.state); + + IList>> kids = new FunctionalList<>(); + + while(true) { + ITree> kid = ctx.parse.parseExpression(inner, ctx.tokens, newState, + statement); + kids.add(kid); + + Token tok = ctx.tokens.current(); + + ctx.tokens.expect(delim, mark); + + if(tok.getKey().equals(mark)) break; + + newState = onDelim.apply(newState); + } + + ctx.state = onExit.apply(newState); + + return new Tree<>(term, kids); + } +} \ No newline at end of file -- cgit v1.2.3