private static class SubExpr implements Expr { private final Expr child; public SubExpr(TokenStream stream) throws ParseException { if(stream.consumeIf(TokenType.LEFT_PAREN) != null) { child = new OrExpr(stream); stream.consume(TokenType.RIGHT_PAREN); } else { child = new EqualsExpr(stream); } } @Override public String toString() { return "("+child+")"; } @Override public boolean evaluate(Map<String, String> data) { return child.evaluate(data); } }
private static class EqualsExpr implements Expr { private final String identifier, literal; public EqualsExpr(TokenStream stream) throws ParseException { Token token = stream.consumeIf(TokenType.IDENTIFIER); if(token != null) { this.identifier = token.data; stream.consume(TokenType.EQUALS); this.literal = stream.consume(TokenType.LITERAL).data; } else { this.literal = stream.consume(TokenType.LITERAL).data; stream.consume(TokenType.EQUALS); this.identifier = stream.consume(TokenType.IDENTIFIER).data; } } @Override public String toString() { return identifier+"='"+literal+"'"; } @Override public boolean evaluate(Map<String, String> data) { return literal.equals(data.get(identifier)); } }