From 41c2a41eaf3c2dd158a2a51947180f402918229e Mon Sep 17 00:00:00 2001 From: bjculkin Date: Fri, 24 Mar 2017 09:54:17 -0400 Subject: Implement Pratt parser. --- .../bjc/utils/parserutils/pratt/NullCommands.java | 115 +++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/NullCommands.java (limited to 'BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/NullCommands.java') diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/NullCommands.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/NullCommands.java new file mode 100644 index 0000000..cf57241 --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/NullCommands.java @@ -0,0 +1,115 @@ +package bjc.utils.parserutils.pratt; + +import bjc.utils.data.ITree; +import bjc.utils.data.Tree; +import bjc.utils.parserutils.ParserException; + +/** + * * Contains factory methods for producing common implementations of + * {@link NullCommand} + * + * @author EVE + * + */ +public class NullCommands { + private static abstract class AbstractNullCommand extends NullCommand { + @Override + public ITree> nullDenotation(Token operator, ParserContext ctx) + throws ParserException { + //tokens.next(); + + return intNullDenotation(operator, ctx); + } + + protected abstract ITree> intNullDenotation(Token operator, ParserContext ctx) + throws ParserException; + + } + + private static class UnaryCommand extends AbstractNullCommand { + private final int nullPwer; + + public UnaryCommand(int nullPower) { + nullPwer = nullPower; + } + + @Override + protected ITree> intNullDenotation(Token operator, ParserContext ctx) + throws ParserException { + ITree> opr = ctx.parse.parseExpression(nullPwer, ctx.tokens, ctx.state); + + return new Tree<>(operator, opr); + } + } + + private static class GroupingCommand extends AbstractNullCommand { + private K term; + private Token mark; + private int inner; + + public GroupingCommand(int innerPrec, K terminator, Token marker) { + inner = innerPrec; + term = terminator; + mark = marker; + } + + @SuppressWarnings("unchecked") + @Override + protected ITree> intNullDenotation(Token operator, ParserContext ctx) + throws ParserException { + ITree> opr = ctx.parse.parseExpression(inner, ctx.tokens, ctx.state); + + ctx.tokens.expect(term); + + return new Tree<>(mark, opr); + } + } + + private static class LeafCommand extends NullCommand { + @Override + public ITree> nullDenotation(Token operator, ParserContext ctx) + throws ParserException { + + return new Tree<>(operator); + } + } + + /** + * Create a new unary operator. + * + * @param precedence + * The precedence of the operator. + * + * @return A command implementing that operator. + */ + public static NullCommand unary(int precedence) { + return new UnaryCommand<>(precedence); + } + + /** + * Create a new grouping operator. + * + * @param precedence + * The precedence of the expression in the operator. + * + * @param term + * The type that closes the group. + * + * @param mark + * The token for the AST node of the group. + * + * @return A command implementing the operator. + */ + public static NullCommand grouping(int precedence, K term, Token mark) { + return new GroupingCommand<>(precedence, term, mark); + } + + /** + * Create a new leaf operator. + * + * @return A command implementing the operator. + */ + public static NullCommand leaf() { + return new LeafCommand<>(); + } +} -- cgit v1.2.3