From b168fd38be0bb344d268bfd11d14df36bb9fd4f2 Mon Sep 17 00:00:00 2001 From: student Date: Fri, 24 Mar 2017 11:51:10 -0400 Subject: Update Pratt parser --- .../bjc/utils/parserutils/pratt/PrattParser.java | 53 +++++++++++++--------- 1 file changed, 31 insertions(+), 22 deletions(-) (limited to 'BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/PrattParser.java') diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/PrattParser.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/PrattParser.java index a2cefda..a8c273d 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/PrattParser.java +++ b/BJC-Utils2/src/main/java/bjc/utils/parserutils/pratt/PrattParser.java @@ -13,66 +13,75 @@ import java.util.Map; * @author EVE * * @param - * The key type for the tokens. + * The key type for the tokens. * * @param - * The value type for the tokens. + * The value type for the tokens. * * @param - * The state type of the parser. + * The state type of the parser. * * */ public class PrattParser { - private final LeftCommand DEFAULT_LEFT_COMMAND = new DefaultLeftCommand<>(); - private final NullCommand DEFAULT_NULL_COMMAND = new DefaultNullCommand<>(); + private final LeftCommand DEFAULT_LEFT_COMMAND = new DefaultLeftCommand<>(); + private final NullCommand DEFAULT_NULL_COMMAND = new DefaultNullCommand<>(); - private Map> leftCommands; - private Map> nullCommands; + private Map> leftCommands; + private Map> nullCommands; + private Map> statementCommands; /** * Create a new Pratt parser. * * @param terminal - * The terminal symbol. + * The terminal symbol. */ public PrattParser() { leftCommands = new HashMap<>(); nullCommands = new HashMap<>(); + statementCommands = new HashMap<>(); } /** * Parse an expression. * * @param precedence - * The initial precedence for the expression. + * The initial precedence for the expression. * * @param tokens - * The tokens for the expression. + * The tokens for the expression. * * @param state - * The state of the parser. + * The state of the parser. * * @return The expression as an AST. * * @throws ParserException - * If something goes wrong during parsing. + * If something goes wrong during parsing. */ - public ITree> parseExpression(int precedence, TokenStream tokens, C state) + public ITree> parseExpression(int precedence, TokenStream tokens, C state, boolean isStatement) throws ParserException { - if(precedence < 0) { + if (precedence < 0) { throw new IllegalArgumentException("Precedence must be greater than zero"); } Token initToken = tokens.current(); tokens.next(); - ITree> ast = nullCommands.getOrDefault(initToken.getKey(), DEFAULT_NULL_COMMAND) - .nullDenotation(initToken, new ParserContext<>(tokens, this, state)); + ITree> ast; + + if (isStatement && statementCommands.containsKey(initToken.getKey())) { + ast = statementCommands.getOrDefault(initToken.getKey(), DEFAULT_NULL_COMMAND).nullDenotation(initToken, + new ParserContext<>(tokens, this, state)); + } else { + ast = nullCommands.getOrDefault(initToken.getKey(), DEFAULT_NULL_COMMAND).nullDenotation(initToken, + new ParserContext<>(tokens, this, state)); + } int rightPrec = Integer.MAX_VALUE; - while(true) { + while (true) { Token tok = tokens.current(); K key = tok.getKey(); @@ -80,7 +89,7 @@ public class PrattParser { LeftCommand command = leftCommands.getOrDefault(key, DEFAULT_LEFT_COMMAND); int leftBind = command.leftBinding(); - if(NumberUtils.between(precedence, rightPrec, leftBind)) { + if (NumberUtils.between(precedence, rightPrec, leftBind)) { tokens.next(); ast = command.leftDenote(ast, tok, new ParserContext<>(tokens, this, state)); @@ -97,10 +106,10 @@ public class PrattParser { * Add a non-initial command to this parser. * * @param marker - * The key that marks the command. + * The key that marks the command. * * @param comm - * The command. + * The command. */ public void addNonInitialCommand(K marker, LeftCommand comm) { leftCommands.put(marker, comm); @@ -110,10 +119,10 @@ public class PrattParser { * Add a initial command to this parser. * * @param marker - * The key that marks the command. + * The key that marks the command. * * @param comm - * The command. + * The command. */ public void addInitialCommand(K marker, NullCommand comm) { nullCommands.put(marker, comm); -- cgit v1.2.3