package bjc.utils.parserutils.pratt.commands; import bjc.utils.data.ITree; import bjc.utils.data.Tree; import bjc.utils.parserutils.ParserException; import bjc.utils.parserutils.pratt.ParserContext; import bjc.utils.parserutils.pratt.Token; public class TernaryCommand extends BinaryPostCommand { private K term; private int innerExp; private Token mark; private boolean nonassoc; public TernaryCommand(int leftPower, K terminator, Token marker, boolean isNonassoc) { super(leftPower); term = terminator; mark = marker; nonassoc = isNonassoc; } @SuppressWarnings("unchecked") @Override public ITree> denote(ITree> operand, Token operator, ParserContext ctx) throws ParserException { ITree> inner = ctx.parse.parseExpression(innerExp, ctx.tokens, ctx.state, false); ctx.tokens.expect(term); ITree> outer = ctx.parse.parseExpression(1 + leftBinding(), ctx.tokens, ctx.state, false); return new Tree<>(mark, inner, operand, outer); } @Override public int nextBinding() { if (nonassoc) { return leftBinding() - 1; } else { return leftBinding(); } } }