From 5269d02a66a08b27c566e54a6a6525f5d90cf782 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 14 Feb 2016 20:17:54 +0200 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B8=D0=BD=D0=BA=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=20=D0=B8=20=D0=B4=D0=B5=D0=BA=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- program.own | 3 +- src/com/annimon/ownlang/parser/Lexer.java | 3 ++ src/com/annimon/ownlang/parser/Parser.java | 19 +++++++-- src/com/annimon/ownlang/parser/TokenType.java | 3 ++ .../parser/ast/AssignmentExpression.java | 7 +++- .../parser/ast/FunctionalExpression.java | 7 +++- .../ownlang/parser/ast/MatchExpression.java | 7 +++- .../ownlang/parser/ast/UnaryExpression.java | 39 ++++++++++++++++++- 8 files changed, 79 insertions(+), 9 deletions(-) diff --git a/program.own b/program.own index 47187a3..b7f63a1 100644 --- a/program.own +++ b/program.own @@ -230,4 +230,5 @@ println x xarr = [0, 5, 2] xarr[0] += xarr[1] xarr[0] *= xarr[2] -println xarr[0] +xarr[0]++ +println xarr[0] \ No newline at end of file diff --git a/src/com/annimon/ownlang/parser/Lexer.java b/src/com/annimon/ownlang/parser/Lexer.java index 91df57b..03c0af2 100644 --- a/src/com/annimon/ownlang/parser/Lexer.java +++ b/src/com/annimon/ownlang/parser/Lexer.java @@ -60,6 +60,9 @@ public final class Lexer { OPERATORS.put(">>=", TokenType.GTGTEQ); OPERATORS.put(">>>=", TokenType.GTGTGTEQ); + OPERATORS.put("++", TokenType.PLUSPLUS); + OPERATORS.put("--", TokenType.MINUSMINUS); + OPERATORS.put("::", TokenType.COLONCOLON); OPERATORS.put("&&", TokenType.AMPAMP); diff --git a/src/com/annimon/ownlang/parser/Parser.java b/src/com/annimon/ownlang/parser/Parser.java index 18230e5..ae8cdbe 100644 --- a/src/com/annimon/ownlang/parser/Parser.java +++ b/src/com/annimon/ownlang/parser/Parser.java @@ -115,9 +115,9 @@ public final class Parser { if (match(TokenType.EXTRACT)) { return destructuringAssignment(); } - final Expression assignment = assignmentStrict(); - if (assignment != null) { - return new ExprStatement(assignment); + final Expression expression = expression(); + if (expression instanceof Statement) { + return (Statement) expression; } throw new ParseException("Unknown statement: " + get(0)); } @@ -561,6 +561,12 @@ public final class Parser { } private Expression unary() { + if (match(TokenType.PLUSPLUS)) { + return new UnaryExpression(UnaryExpression.Operator.INCREMENT_PREFIX, primary()); + } + if (match(TokenType.MINUSMINUS)) { + return new UnaryExpression(UnaryExpression.Operator.DECREMENT_PREFIX, primary()); + } if (match(TokenType.MINUS)) { return new UnaryExpression(UnaryExpression.Operator.NEGATE, primary()); } @@ -610,6 +616,13 @@ public final class Parser { if (lookMatch(0, TokenType.LPAREN)) { return function(qualifiedNameExpr); } + // postfix increment/decrement + if (match(TokenType.PLUSPLUS)) { + return new UnaryExpression(UnaryExpression.Operator.INCREMENT_POSTFIX, qualifiedNameExpr); + } + if (match(TokenType.MINUSMINUS)) { + return new UnaryExpression(UnaryExpression.Operator.DECREMENT_POSTFIX, qualifiedNameExpr); + } return qualifiedNameExpr; } diff --git a/src/com/annimon/ownlang/parser/TokenType.java b/src/com/annimon/ownlang/parser/TokenType.java index 2e7a188..c277896 100644 --- a/src/com/annimon/ownlang/parser/TokenType.java +++ b/src/com/annimon/ownlang/parser/TokenType.java @@ -56,6 +56,9 @@ public enum TokenType { GTGTEQ, // >>= GTGTGTEQ, // >>>= + PLUSPLUS, // ++ + MINUSMINUS, // -- + LTLT, // << GTGT, // >> GTGTGT, // >>> diff --git a/src/com/annimon/ownlang/parser/ast/AssignmentExpression.java b/src/com/annimon/ownlang/parser/ast/AssignmentExpression.java index 15eb851..140a714 100644 --- a/src/com/annimon/ownlang/parser/ast/AssignmentExpression.java +++ b/src/com/annimon/ownlang/parser/ast/AssignmentExpression.java @@ -6,7 +6,7 @@ import com.annimon.ownlang.lib.Value; * * @author aNNiMON */ -public final class AssignmentExpression implements Expression { +public final class AssignmentExpression implements Expression, Statement { public final Accessible target; public final BinaryExpression.Operator operation; @@ -17,6 +17,11 @@ public final class AssignmentExpression implements Expression { this.target = target; this.expression = expr; } + + @Override + public void execute() { + eval(); + } @Override public Value eval() { diff --git a/src/com/annimon/ownlang/parser/ast/FunctionalExpression.java b/src/com/annimon/ownlang/parser/ast/FunctionalExpression.java index f1c51c4..0770fd5 100644 --- a/src/com/annimon/ownlang/parser/ast/FunctionalExpression.java +++ b/src/com/annimon/ownlang/parser/ast/FunctionalExpression.java @@ -10,7 +10,7 @@ import java.util.List; * * @author aNNiMON */ -public final class FunctionalExpression implements Expression { +public final class FunctionalExpression implements Expression, Statement { public final Expression functionExpr; public final List arguments; @@ -24,6 +24,11 @@ public final class FunctionalExpression implements Expression { arguments.add(arg); } + @Override + public void execute() { + eval(); + } + @Override public Value eval() { final int size = arguments.size(); diff --git a/src/com/annimon/ownlang/parser/ast/MatchExpression.java b/src/com/annimon/ownlang/parser/ast/MatchExpression.java index 7b8634b..8e8a2c9 100644 --- a/src/com/annimon/ownlang/parser/ast/MatchExpression.java +++ b/src/com/annimon/ownlang/parser/ast/MatchExpression.java @@ -13,7 +13,7 @@ import java.util.List; * * @author aNNiMON */ -public final class MatchExpression implements Expression { +public final class MatchExpression implements Expression, Statement { public final Expression expression; public final List patterns; @@ -23,6 +23,11 @@ public final class MatchExpression implements Expression { this.patterns = patterns; } + @Override + public void execute() { + eval(); + } + @Override public Value eval() { final Value value = expression.eval(); diff --git a/src/com/annimon/ownlang/parser/ast/UnaryExpression.java b/src/com/annimon/ownlang/parser/ast/UnaryExpression.java index b9abd3b..1d688bd 100644 --- a/src/com/annimon/ownlang/parser/ast/UnaryExpression.java +++ b/src/com/annimon/ownlang/parser/ast/UnaryExpression.java @@ -8,9 +8,13 @@ import com.annimon.ownlang.lib.Value; * * @author aNNiMON */ -public final class UnaryExpression implements Expression { - +public final class UnaryExpression implements Expression, Statement { + public static enum Operator { + INCREMENT_PREFIX("++"), + DECREMENT_PREFIX("--"), + INCREMENT_POSTFIX("++"), + DECREMENT_POSTFIX("--"), NEGATE("-"), // Boolean NOT("!"), @@ -37,10 +41,41 @@ public final class UnaryExpression implements Expression { this.expr1 = expr1; } + @Override + public void execute() { + eval(); + } + @Override public Value eval() { final Value value = expr1.eval(); switch (operation) { + case INCREMENT_PREFIX: { + if (expr1 instanceof Accessible) { + return ((Accessible) expr1).set(new NumberValue(value.asNumber() + 1)); + } + return new NumberValue(value.asNumber() + 1); + } + case DECREMENT_PREFIX: { + if (expr1 instanceof Accessible) { + return ((Accessible) expr1).set(new NumberValue(value.asNumber() - 1)); + } + return new NumberValue(value.asNumber() - 1); + } + case INCREMENT_POSTFIX: { + if (expr1 instanceof Accessible) { + ((Accessible) expr1).set(new NumberValue(value.asNumber() + 1)); + return value; + } + return new NumberValue(value.asNumber() + 1); + } + case DECREMENT_POSTFIX: { + if (expr1 instanceof Accessible) { + ((Accessible) expr1).set(new NumberValue(value.asNumber() - 1)); + return value; + } + return new NumberValue(value.asNumber() - 1); + } case NEGATE: return new NumberValue(-value.asNumber()); case COMPLEMENT: return new NumberValue(~(int)value.asNumber()); case NOT: return new NumberValue(value.asNumber() != 0 ? 0 : 1);