public Expression parse(Rover rover) { try { String cacheKey = rover.findExpr(); Expression e = cache.get(cacheKey); if (e != null) { rover.n += cacheKey.length(); return e; } rover.ws(); char c = rover.current(); if (c != '(') throw new IllegalArgumentException("Expression must start with a '('"); rover.next(); rover.ws(); e = parse0(rover); rover.ws(); c = rover.current(); if (c != ')') throw new IllegalArgumentException("Expression must end with a ')'"); rover.next(); cache.put(cacheKey, e); return e; } catch (RuntimeException re) { throw new RuntimeException("Parsing failed: " + re.getMessage() + ":\n" + rover + "\n", re); } }
Expression parse0(Rover rover) { rover.ws(); switch (rover.next()) { case '&' : return And.make(parseExprs(rover)); String key = rover.getKey(); char s = rover.next(); if (s == '=') { String value = rover.getValue(); if (value.indexOf('*') >= 0) return new PatternExpression(key, value); char eq = rover.next(); if (eq != '=') throw new IllegalArgumentException("Expected an = after " + rover.current()); return new ApproximateExpression(key, rover.getValue()); case '>' : return SimpleExpression.make(key, Op.GREATER_OR_EQUAL, rover.getValue()); case '<' : return SimpleExpression.make(key, Op.LESS_OR_EQUAL, rover.getValue()); default : throw new IllegalArgumentException("Expected '~=', '>=', '<='");
Expression parse0(Rover rover) throws IOException { switch (rover.next()) { case '&' : return And.make(parseExprs(rover)); String key = rover.getKey(); char s = rover.next(); if (s == '=') { String value = rover.getValue(); if (value.indexOf('*') >= 0) return new PatternExpression(key, value); char eq = rover.next(); if (eq != '=') throw new IllegalArgumentException("Expected an = after " + rover.current()); return new ApproximateExpression(key, rover.getValue()); case '>' : return SimpleExpression.make(key, Op.GREATER_OR_EQUAL, rover.getValue()); case '<' : return SimpleExpression.make(key, Op.LESS_OR_EQUAL, rover.getValue()); default : throw new IllegalArgumentException("Expected '~=', '>=', '<='");
Expression parse0(Rover rover) throws IOException { switch (rover.next()) { case '&' : return And.make(parseExprs(rover)); String key = rover.getKey(); char s = rover.next(); if (s == '=') { String value = rover.getValue(); if (value.indexOf('*') >= 0) return new PatternExpression(key, value); char eq = rover.next(); if (eq != '=') throw new IllegalArgumentException("Expected an = after " + rover.current()); return new ApproximateExpression(key, rover.getValue()); case '>' : return SimpleExpression.make(key, Op.GREATER_OR_EQUAL, rover.getValue()); case '<' : return SimpleExpression.make(key, Op.LESS_OR_EQUAL, rover.getValue()); default : throw new IllegalArgumentException("Expected '~=', '>=', '<='");
Expression parse0(Rover rover) { rover.ws(); switch (rover.next()) { case '&' : return And.make(parseExprs(rover)); String key = rover.getKey(); char s = rover.next(); if (s == '=') { String value = rover.getValue(); if (value.indexOf('*') >= 0) return new PatternExpression(key, value); char eq = rover.next(); if (eq != '=') throw new IllegalArgumentException("Expected an = after " + rover.current()); return new ApproximateExpression(key, rover.getValue()); case '>' : return SimpleExpression.make(key, Op.GREATER_OR_EQUAL, rover.getValue()); case '<' : return SimpleExpression.make(key, Op.LESS_OR_EQUAL, rover.getValue()); default : throw new IllegalArgumentException("Expected '~=', '>=', '<='");
public Expression parse(Rover rover) { try { String cacheKey = rover.findExpr(); Expression e = cache.get(cacheKey); if (e != null) { rover.n += cacheKey.length(); return e; } rover.ws(); char c = rover.current(); if (c != '(') throw new IllegalArgumentException("Expression must start with a '('"); rover.next(); rover.ws(); e = parse0(rover); rover.ws(); c = rover.current(); if (c != ')') throw new IllegalArgumentException("Expression must end with a ')'"); rover.next(); cache.put(cacheKey, e); return e; } catch (RuntimeException re) { throw new RuntimeException("Parsing failed: " + re.getMessage() + ":\n" + rover + "\n", re); } }
public Expression parse(Rover rover) throws IOException { String s = rover.findExpr(); Expression e = cache.get(s); if (e != null) { rover.n += s.length(); return e; } try { char c = rover.next(); if (c != '(') throw new IllegalArgumentException("Expression must start with a ("); e = parse0(rover); c = rover.next(); if (c != ')') throw new IllegalArgumentException("Expression must end with a )"); } catch (IllegalArgumentException ie) { throw new RuntimeException("Parsing failed on " + s + " " + ie.getMessage()); } cache.put(s, e); return e; }
public Expression parse(Rover rover) throws IOException { String s = rover.findExpr(); Expression e = cache.get(s); if (e != null) { rover.n += s.length(); return e; } try { char c = rover.next(); if (c != '(') throw new IllegalArgumentException("Expression must start with a ("); e = parse0(rover); c = rover.next(); if (c != ')') throw new IllegalArgumentException("Expression must end with a )"); } catch (IllegalArgumentException ie) { throw new RuntimeException("Parsing failed on " + s + " " + ie.getMessage()); } cache.put(s, e); return e; }
void ws() { while (Character.isWhitespace(current())) n++; }
void ws() { while (Character.isWhitespace(current())) n++; }
void ws() { while (Character.isWhitespace(current())) n++; }
private List<Expression> parseExprs(Rover rover) throws IOException { ArrayList<Expression> exprs = new ArrayList<Expression>(); while (rover.current() == '(') { Expression expr = parse(rover); exprs.add(expr); } return exprs; }
public Expression parse(String s) { Rover rover = new Rover(); rover.s = s; rover.n = 0; return parse(rover); }
public Expression parse(String s) throws IOException { Rover rover = new Rover(); rover.s = s; rover.n = 0; return parse(rover); }
private List<Expression> parseExprs(Rover rover) throws IOException { ArrayList<Expression> exprs = new ArrayList<Expression>(); while (rover.current() == '(') { Expression expr = parse(rover); exprs.add(expr); } return exprs; }