From cbe463b1499048bf839fb3072514af0a160ea54e Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 16 Apr 2015 14:00:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=83=D0=BD=D0=B0=D1=80=D0=BD=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BE=D1=82=D1=80=D0=B8=D1=86=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/everlastingsummer/Lexer.java | 4 ++-- src/com/annimon/everlastingsummer/Parser.java | 5 ++++- src/com/annimon/everlastingsummer/TokenType.java | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/com/annimon/everlastingsummer/Lexer.java b/src/com/annimon/everlastingsummer/Lexer.java index 35d370b..610a612 100644 --- a/src/com/annimon/everlastingsummer/Lexer.java +++ b/src/com/annimon/everlastingsummer/Lexer.java @@ -15,12 +15,12 @@ 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.LPAREN, TokenType.RPAREN, TokenType.LBRACKET, TokenType.RBRACKET, - TokenType.COMMAND, TokenType.COLON, + TokenType.EXCL, TokenType.COMMAND, TokenType.COLON, }; private static final Map KEYWORDS; diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index 5a3683d..5eb4d4d 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -377,7 +377,7 @@ public final class Parser { } private boolean ifStatement() { - final Expression condition = primary(); + final Expression condition = expression(); consume(TokenType.COLON); if (condition.eval() == 0) { @@ -421,6 +421,9 @@ public final class Parser { if (match(TokenType.PLUS)) { return primary(); } + if (match(TokenType.EXCL)) { + return new ValueExpression( primary().eval() != 0 ? 0 : 1 ); + } return primary(); } diff --git a/src/com/annimon/everlastingsummer/TokenType.java b/src/com/annimon/everlastingsummer/TokenType.java index 1349419..3e17aeb 100644 --- a/src/com/annimon/everlastingsummer/TokenType.java +++ b/src/com/annimon/everlastingsummer/TokenType.java @@ -18,6 +18,7 @@ public enum TokenType { RPAREN, LBRACKET, RBRACKET, + EXCL, COLON, // ключевые слова