package bjc.pratt.blocks; import java.util.function.Function; import bjc.pratt.ParseBlock; import bjc.pratt.ParserContext; import bjc.pratt.PrattParser; import bjc.pratt.Token; import bjc.pratt.TokenStream; import bjc.utils.data.ITree; import bjc.utils.funcutils.Isomorphism; import bjc.utils.parserutils.ParserException; /** * A {@link ParseBlock} that parses an expression from a 'inner' grammar. * * @author bjculkin * * @param * The key type of the outer tokens. * * @param * The value type of the outer tokens. * * @param * The state type of the outer parser. * * @param * The key type of the inner tokens. * * @param * The value type of the inner tokens. * * @param * The state type of the outer parser. */ public class GrammarParseBlock implements ParseBlock { private final PrattParser innr; private final int prcedence; private final boolean isStatemnt; private final Function, TokenStream> tkenTransform; private final Isomorphism stteTransform; private final Function>, ITree>> xpressionTransform; /** * Create a new grammar parser block. * * @param inner * @param precedence * @param isStatement * @param tokenTransform * @param stateTransform * @param expressionTransform */ public GrammarParseBlock(final PrattParser inner, final int precedence, final boolean isStatement, final Function, TokenStream> tokenTransform, final Isomorphism stateTransform, final Function>, ITree>> expressionTransform) { innr = inner; prcedence = precedence; isStatemnt = isStatement; tkenTransform = tokenTransform; stteTransform = stateTransform; xpressionTransform = expressionTransform; } @Override public ITree> parse(final ParserContext ctx) throws ParserException { final C2 newState = stteTransform.to(ctx.state); final TokenStream newTokens = tkenTransform.apply(ctx.tokens); final ITree> expression = innr.parseExpression(prcedence, newTokens, newState, isStatemnt); ctx.state = stteTransform.from(newState); return xpressionTransform.apply(expression); } }