Добавлен инкремент и декремент

This commit is contained in:
Victor 2016-02-14 20:17:54 +02:00
parent 53cfe5d1e1
commit 5269d02a66
8 changed files with 79 additions and 9 deletions

View File

@ -230,4 +230,5 @@ println x
xarr = [0, 5, 2] xarr = [0, 5, 2]
xarr[0] += xarr[1] xarr[0] += xarr[1]
xarr[0] *= xarr[2] xarr[0] *= xarr[2]
xarr[0]++
println xarr[0] println xarr[0]

View File

@ -60,6 +60,9 @@ public final class Lexer {
OPERATORS.put(">>=", TokenType.GTGTEQ); OPERATORS.put(">>=", TokenType.GTGTEQ);
OPERATORS.put(">>>=", TokenType.GTGTGTEQ); OPERATORS.put(">>>=", TokenType.GTGTGTEQ);
OPERATORS.put("++", TokenType.PLUSPLUS);
OPERATORS.put("--", TokenType.MINUSMINUS);
OPERATORS.put("::", TokenType.COLONCOLON); OPERATORS.put("::", TokenType.COLONCOLON);
OPERATORS.put("&&", TokenType.AMPAMP); OPERATORS.put("&&", TokenType.AMPAMP);

View File

@ -115,9 +115,9 @@ public final class Parser {
if (match(TokenType.EXTRACT)) { if (match(TokenType.EXTRACT)) {
return destructuringAssignment(); return destructuringAssignment();
} }
final Expression assignment = assignmentStrict(); final Expression expression = expression();
if (assignment != null) { if (expression instanceof Statement) {
return new ExprStatement(assignment); return (Statement) expression;
} }
throw new ParseException("Unknown statement: " + get(0)); throw new ParseException("Unknown statement: " + get(0));
} }
@ -561,6 +561,12 @@ public final class Parser {
} }
private Expression unary() { 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)) { if (match(TokenType.MINUS)) {
return new UnaryExpression(UnaryExpression.Operator.NEGATE, primary()); return new UnaryExpression(UnaryExpression.Operator.NEGATE, primary());
} }
@ -610,6 +616,13 @@ public final class Parser {
if (lookMatch(0, TokenType.LPAREN)) { if (lookMatch(0, TokenType.LPAREN)) {
return function(qualifiedNameExpr); 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; return qualifiedNameExpr;
} }

View File

@ -56,6 +56,9 @@ public enum TokenType {
GTGTEQ, // >>= GTGTEQ, // >>=
GTGTGTEQ, // >>>= GTGTGTEQ, // >>>=
PLUSPLUS, // ++
MINUSMINUS, // --
LTLT, // << LTLT, // <<
GTGT, // >> GTGT, // >>
GTGTGT, // >>> GTGTGT, // >>>

View File

@ -6,7 +6,7 @@ import com.annimon.ownlang.lib.Value;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public final class AssignmentExpression implements Expression { public final class AssignmentExpression implements Expression, Statement {
public final Accessible target; public final Accessible target;
public final BinaryExpression.Operator operation; public final BinaryExpression.Operator operation;
@ -18,6 +18,11 @@ public final class AssignmentExpression implements Expression {
this.expression = expr; this.expression = expr;
} }
@Override
public void execute() {
eval();
}
@Override @Override
public Value eval() { public Value eval() {
if (operation == null) { if (operation == null) {

View File

@ -10,7 +10,7 @@ import java.util.List;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public final class FunctionalExpression implements Expression { public final class FunctionalExpression implements Expression, Statement {
public final Expression functionExpr; public final Expression functionExpr;
public final List<Expression> arguments; public final List<Expression> arguments;
@ -24,6 +24,11 @@ public final class FunctionalExpression implements Expression {
arguments.add(arg); arguments.add(arg);
} }
@Override
public void execute() {
eval();
}
@Override @Override
public Value eval() { public Value eval() {
final int size = arguments.size(); final int size = arguments.size();

View File

@ -13,7 +13,7 @@ import java.util.List;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public final class MatchExpression implements Expression { public final class MatchExpression implements Expression, Statement {
public final Expression expression; public final Expression expression;
public final List<Pattern> patterns; public final List<Pattern> patterns;
@ -23,6 +23,11 @@ public final class MatchExpression implements Expression {
this.patterns = patterns; this.patterns = patterns;
} }
@Override
public void execute() {
eval();
}
@Override @Override
public Value eval() { public Value eval() {
final Value value = expression.eval(); final Value value = expression.eval();

View File

@ -8,9 +8,13 @@ import com.annimon.ownlang.lib.Value;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public final class UnaryExpression implements Expression { public final class UnaryExpression implements Expression, Statement {
public static enum Operator { public static enum Operator {
INCREMENT_PREFIX("++"),
DECREMENT_PREFIX("--"),
INCREMENT_POSTFIX("++"),
DECREMENT_POSTFIX("--"),
NEGATE("-"), NEGATE("-"),
// Boolean // Boolean
NOT("!"), NOT("!"),
@ -37,10 +41,41 @@ public final class UnaryExpression implements Expression {
this.expr1 = expr1; this.expr1 = expr1;
} }
@Override
public void execute() {
eval();
}
@Override @Override
public Value eval() { public Value eval() {
final Value value = expr1.eval(); final Value value = expr1.eval();
switch (operation) { 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 NEGATE: return new NumberValue(-value.asNumber());
case COMPLEMENT: return new NumberValue(~(int)value.asNumber()); case COMPLEMENT: return new NumberValue(~(int)value.asNumber());
case NOT: return new NumberValue(value.asNumber() != 0 ? 0 : 1); case NOT: return new NumberValue(value.asNumber() != 0 ? 0 : 1);