diff --git a/src/com/annimon/everlastingsummer/Lexer.java b/src/com/annimon/everlastingsummer/Lexer.java index 71604da..e6259d6 100644 --- a/src/com/annimon/everlastingsummer/Lexer.java +++ b/src/com/annimon/everlastingsummer/Lexer.java @@ -15,10 +15,11 @@ public final class Lexer { return new Lexer().process(input).getTokens(); } - private static final String OPERATOR_CHARS = "=+-()[]!$:"; + private static final String OPERATOR_CHARS = "=+-<>()[]!$:"; private static final TokenType[] OPERATOR_TYPES = new TokenType[] { TokenType.EQ, - TokenType.PLUS, TokenType.MINUS, + TokenType.PLUS, TokenType.MINUS, + TokenType.LT, TokenType.GT, TokenType.LPAREN, TokenType.RPAREN, TokenType.LBRACKET, TokenType.RBRACKET, TokenType.EXCL, TokenType.COMMAND, TokenType.COLON, }; diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index 8d812ff..79df171 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -447,25 +447,50 @@ public final class Parser { if (match(TokenType.NOT)) { return new ValueExpression( notTest().eval() != 0 ? 0 : 1 ); } - return equality(); + return comparison(); } - private Expression equality() { + private Expression comparison() { Expression expression = additive(); - if (lookMatch(1, TokenType.EQ)) { - if (match(TokenType.EQ)) { - // == - match(TokenType.EQ); - return new BinaryExpression(Operator.EQUALS, expression, additive()); + while (true) { + if (lookMatch(1, TokenType.EQ)) { + if (match(TokenType.EQ)) { + // == + match(TokenType.EQ); + expression = new BinaryExpression(Operator.EQUALS, expression, additive()); + continue; + } + if (match(TokenType.GT)) { + // >= + match(TokenType.EQ); + expression = new BinaryExpression(Operator.GTEQ, expression, additive()); + continue; + } + if (match(TokenType.LT)) { + // <= + match(TokenType.EQ); + expression = new BinaryExpression(Operator.LTEQ, expression, additive()); + continue; + } + if (match(TokenType.EXCL)) { + // != + match(TokenType.EQ); + expression = new BinaryExpression(Operator.NOTEQUALS, expression, additive()); + continue; + } } - if (match(TokenType.EXCL)) { - // != - match(TokenType.EQ); - return new BinaryExpression(Operator.NOTEQUALS, expression, additive()); + + if (match(TokenType.LT)) { + expression = new BinaryExpression(Operator.LT, expression, additive()); + continue; } + if (match(TokenType.GT)) { + expression = new BinaryExpression(Operator.GT, expression, additive()); + continue; + } + break; } - return expression; } diff --git a/src/com/annimon/everlastingsummer/TokenType.java b/src/com/annimon/everlastingsummer/TokenType.java index 89a0cd6..22f8534 100644 --- a/src/com/annimon/everlastingsummer/TokenType.java +++ b/src/com/annimon/everlastingsummer/TokenType.java @@ -14,6 +14,8 @@ public enum TokenType { EQ, PLUS, MINUS, + LT, + GT, LPAREN, RPAREN, LBRACKET, diff --git a/src/com/annimon/everlastingsummer/ast/BinaryExpression.java b/src/com/annimon/everlastingsummer/ast/BinaryExpression.java index ee60b60..e463fec 100644 --- a/src/com/annimon/everlastingsummer/ast/BinaryExpression.java +++ b/src/com/annimon/everlastingsummer/ast/BinaryExpression.java @@ -9,6 +9,7 @@ public class BinaryExpression implements Expression { ADD, SUBTRACT, BOOLEAN_OR, BOOLEAN_AND, EQUALS, NOTEQUALS, + GT, GTEQ, LT, LTEQ } public final Operator operator; @@ -31,6 +32,10 @@ public class BinaryExpression implements Expression { case NOTEQUALS: return (leftVal != rightVal) ? 1 : 0; case BOOLEAN_OR: return ((leftVal != 0) || (rightVal != 0)) ? 1 : 0; case BOOLEAN_AND: return ((leftVal != 0) && (rightVal != 0)) ? 1 : 0; + case GT: return (leftVal > rightVal) ? 1 : 0; + case LT: return (leftVal < rightVal) ? 1 : 0; + case GTEQ: return (leftVal >= rightVal) ? 1 : 0; + case LTEQ: return (leftVal <= rightVal) ? 1 : 0; default: throw new RuntimeException("Неизвестный оператор " + operator.name()); }