Use CompositeExpression for expression building

This commit is contained in:
Zafar Khaja 2014-10-21 23:15:04 +03:00
parent cb6bc0a72b
commit 370bc2b33a

View File

@ -32,6 +32,7 @@ import com.github.zafarkhaja.semver.util.UnexpectedElementException;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Iterator; import java.util.Iterator;
import static com.github.zafarkhaja.semver.expr.Lexer.Token.Type.*; import static com.github.zafarkhaja.semver.expr.Lexer.Token.Type.*;
import static com.github.zafarkhaja.semver.expr.CompositeExpression.Helper.*;
/** /**
* A parser for the SemVer Expressions. * A parser for the SemVer Expressions.
@ -102,12 +103,12 @@ public class ExpressionParser implements Parser<Expression> {
* *
* @return the expression AST * @return the expression AST
*/ */
private Expression parseSemVerExpression() { private CompositeExpression parseSemVerExpression() {
Expression expr; CompositeExpression expr;
if (tokens.positiveLookahead(NOT)) { if (tokens.positiveLookahead(NOT)) {
tokens.consume(); tokens.consume();
consumeNextToken(LEFT_PAREN); consumeNextToken(LEFT_PAREN);
expr = new Not(parseSemVerExpression()); expr = not(parseSemVerExpression());
consumeNextToken(RIGHT_PAREN); consumeNextToken(RIGHT_PAREN);
} else if (tokens.positiveLookahead(LEFT_PAREN)) { } else if (tokens.positiveLookahead(LEFT_PAREN)) {
consumeNextToken(LEFT_PAREN); consumeNextToken(LEFT_PAREN);
@ -132,13 +133,13 @@ public class ExpressionParser implements Parser<Expression> {
* @param expr the left-hand expression of the logical operators * @param expr the left-hand expression of the logical operators
* @return the expression AST * @return the expression AST
*/ */
private Expression parseBooleanExpression(Expression expr) { private CompositeExpression parseBooleanExpression(CompositeExpression expr) {
if (tokens.positiveLookahead(AND)) { if (tokens.positiveLookahead(AND)) {
tokens.consume(); tokens.consume();
expr = new And(expr, parseSemVerExpression()); expr = expr.and(parseSemVerExpression());
} else if (tokens.positiveLookahead(OR)) { } else if (tokens.positiveLookahead(OR)) {
tokens.consume(); tokens.consume();
expr = new Or(expr, parseSemVerExpression()); expr = expr.or(parseSemVerExpression());
} }
return expr; return expr;
} }
@ -157,7 +158,7 @@ public class ExpressionParser implements Parser<Expression> {
* *
* @return the expression AST * @return the expression AST
*/ */
private Expression parseExpression() { private CompositeExpression parseExpression() {
if (tokens.positiveLookahead(TILDE)) { if (tokens.positiveLookahead(TILDE)) {
return parseTildeExpression(); return parseTildeExpression();
} else if (isVersionExpression()) { } else if (isVersionExpression()) {
@ -180,36 +181,36 @@ public class ExpressionParser implements Parser<Expression> {
* *
* @return the expression AST * @return the expression AST
*/ */
private Expression parseComparisonExpression() { private CompositeExpression parseComparisonExpression() {
Token token = tokens.lookahead(); Token token = tokens.lookahead();
Expression expr; CompositeExpression expr;
switch (token.type) { switch (token.type) {
case EQUAL: case EQUAL:
tokens.consume(); tokens.consume();
expr = new Equal(parseVersion()); expr = eq(parseVersion());
break; break;
case NOT_EQUAL: case NOT_EQUAL:
tokens.consume(); tokens.consume();
expr = new NotEqual(parseVersion()); expr = neq(parseVersion());
break; break;
case GREATER: case GREATER:
tokens.consume(); tokens.consume();
expr = new Greater(parseVersion()); expr = gt(parseVersion());
break; break;
case GREATER_EQUAL: case GREATER_EQUAL:
tokens.consume(); tokens.consume();
expr = new GreaterOrEqual(parseVersion()); expr = gte(parseVersion());
break; break;
case LESS: case LESS:
tokens.consume(); tokens.consume();
expr = new Less(parseVersion()); expr = lt(parseVersion());
break; break;
case LESS_EQUAL: case LESS_EQUAL:
tokens.consume(); tokens.consume();
expr = new LessOrEqual(parseVersion()); expr = lte(parseVersion());
break; break;
default: default:
expr = new Equal(parseVersion()); expr = eq(parseVersion());
} }
return expr; return expr;
} }
@ -225,26 +226,20 @@ public class ExpressionParser implements Parser<Expression> {
* *
* @return the expression AST * @return the expression AST
*/ */
private Expression parseTildeExpression() { private CompositeExpression parseTildeExpression() {
consumeNextToken(TILDE); consumeNextToken(TILDE);
int major = intOf(consumeNextToken(NUMERIC).lexeme); int major = intOf(consumeNextToken(NUMERIC).lexeme);
if (!tokens.positiveLookahead(DOT)) { if (!tokens.positiveLookahead(DOT)) {
return new GreaterOrEqual(versionOf(major, 0, 0)); return gte(versionOf(major, 0, 0));
} }
consumeNextToken(DOT); consumeNextToken(DOT);
int minor = intOf(consumeNextToken(NUMERIC).lexeme); int minor = intOf(consumeNextToken(NUMERIC).lexeme);
if (!tokens.positiveLookahead(DOT)) { if (!tokens.positiveLookahead(DOT)) {
return new And( return gte(versionOf(major, minor, 0)).and(lt(versionOf(major + 1, 0, 0)));
new GreaterOrEqual(versionOf(major, minor, 0)),
new Less(versionOf(major + 1, 0, 0))
);
} }
consumeNextToken(DOT); consumeNextToken(DOT);
int patch = intOf(consumeNextToken(NUMERIC).lexeme); int patch = intOf(consumeNextToken(NUMERIC).lexeme);
return new And( return gte(versionOf(major, minor, patch)).and(lt(versionOf(major, minor + 1, 0)));
new GreaterOrEqual(versionOf(major, minor, patch)),
new Less(versionOf(major, minor + 1, 0))
);
} }
/** /**
@ -271,23 +266,17 @@ public class ExpressionParser implements Parser<Expression> {
* *
* @return the expression AST * @return the expression AST
*/ */
private Expression parseVersionExpression() { private CompositeExpression parseVersionExpression() {
int major = intOf(consumeNextToken(NUMERIC).lexeme); int major = intOf(consumeNextToken(NUMERIC).lexeme);
consumeNextToken(DOT); consumeNextToken(DOT);
if (tokens.positiveLookahead(STAR)) { if (tokens.positiveLookahead(STAR)) {
tokens.consume(); tokens.consume();
return new And( return gte(versionOf(major, 0, 0)).and(lt(versionOf(major + 1, 0, 0)));
new GreaterOrEqual(versionOf(major, 0, 0)),
new Less(versionOf(major + 1, 0, 0))
);
} }
int minor = intOf(consumeNextToken(NUMERIC).lexeme); int minor = intOf(consumeNextToken(NUMERIC).lexeme);
consumeNextToken(DOT); consumeNextToken(DOT);
consumeNextToken(STAR); consumeNextToken(STAR);
return new And( return gte(versionOf(major, minor, 0)).and(lt(versionOf(major, minor + 1, 0)));
new GreaterOrEqual(versionOf(major, minor, 0)),
new Less(versionOf(major, minor + 1, 0))
);
} }
/** /**
@ -313,11 +302,10 @@ public class ExpressionParser implements Parser<Expression> {
* *
* @return the expression AST * @return the expression AST
*/ */
private Expression parseRangeExpression() { private CompositeExpression parseRangeExpression() {
Expression ge = new GreaterOrEqual(parseVersion()); CompositeExpression gte = gte(parseVersion());
consumeNextToken(HYPHEN); consumeNextToken(HYPHEN);
Expression le = new LessOrEqual(parseVersion()); return gte.and(lte(parseVersion()));
return new And(ge, le);
} }
/** /**