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); } }