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 PrattParser inner; private int precedence; private boolean isStatement; private Function, TokenStream> tokenTransform; private Isomorphism stateTransform; private Function>, ITree>> expressionTransform; /** * Create a new grammar parser block. * * @param inner * @param precedence * @param isStatement * @param tokenTransform * @param stateTransform * @param expressionTransform */ public GrammarParseBlock(PrattParser inner, int precedence, boolean isStatement, Function, TokenStream> tokenTransform, Isomorphism stateTransform, Function>, ITree>> expressionTransform) { this.inner = inner; this.precedence = precedence; this.isStatement = isStatement; this.tokenTransform = tokenTransform; this.stateTransform = stateTransform; this.expressionTransform = expressionTransform; } @Override public ITree> parse(ParserContext ctx) throws ParserException { C2 newState = stateTransform.to(ctx.state); TokenStream newTokens = tokenTransform.apply(ctx.tokens); ITree> expression = inner.parseExpression(precedence, newTokens, newState, isStatement); ctx.state = stateTransform.from(newState); return expressionTransform.apply(expression); } }