Skip to content

Commit 5269d02

Browse files
committed
Добавлен инкремент и декремент
1 parent 53cfe5d commit 5269d02

File tree

8 files changed

+79
-9
lines changed

8 files changed

+79
-9
lines changed

program.own

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,4 +230,5 @@ println x
230230
xarr = [0, 5, 2]
231231
xarr[0] += xarr[1]
232232
xarr[0] *= xarr[2]
233-
println xarr[0]
233+
xarr[0]++
234+
println xarr[0]

src/com/annimon/ownlang/parser/Lexer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ public final class Lexer {
6060
OPERATORS.put(">>=", TokenType.GTGTEQ);
6161
OPERATORS.put(">>>=", TokenType.GTGTGTEQ);
6262

63+
OPERATORS.put("++", TokenType.PLUSPLUS);
64+
OPERATORS.put("--", TokenType.MINUSMINUS);
65+
6366
OPERATORS.put("::", TokenType.COLONCOLON);
6467

6568
OPERATORS.put("&&", TokenType.AMPAMP);

src/com/annimon/ownlang/parser/Parser.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ private Statement assignmentStatement() {
115115
if (match(TokenType.EXTRACT)) {
116116
return destructuringAssignment();
117117
}
118-
final Expression assignment = assignmentStrict();
119-
if (assignment != null) {
120-
return new ExprStatement(assignment);
118+
final Expression expression = expression();
119+
if (expression instanceof Statement) {
120+
return (Statement) expression;
121121
}
122122
throw new ParseException("Unknown statement: " + get(0));
123123
}
@@ -561,6 +561,12 @@ private Expression multiplicative() {
561561
}
562562

563563
private Expression unary() {
564+
if (match(TokenType.PLUSPLUS)) {
565+
return new UnaryExpression(UnaryExpression.Operator.INCREMENT_PREFIX, primary());
566+
}
567+
if (match(TokenType.MINUSMINUS)) {
568+
return new UnaryExpression(UnaryExpression.Operator.DECREMENT_PREFIX, primary());
569+
}
564570
if (match(TokenType.MINUS)) {
565571
return new UnaryExpression(UnaryExpression.Operator.NEGATE, primary());
566572
}
@@ -610,6 +616,13 @@ private Expression variable() {
610616
if (lookMatch(0, TokenType.LPAREN)) {
611617
return function(qualifiedNameExpr);
612618
}
619+
// postfix increment/decrement
620+
if (match(TokenType.PLUSPLUS)) {
621+
return new UnaryExpression(UnaryExpression.Operator.INCREMENT_POSTFIX, qualifiedNameExpr);
622+
}
623+
if (match(TokenType.MINUSMINUS)) {
624+
return new UnaryExpression(UnaryExpression.Operator.DECREMENT_POSTFIX, qualifiedNameExpr);
625+
}
613626
return qualifiedNameExpr;
614627
}
615628

src/com/annimon/ownlang/parser/TokenType.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ public enum TokenType {
5656
GTGTEQ, // >>=
5757
GTGTGTEQ, // >>>=
5858

59+
PLUSPLUS, // ++
60+
MINUSMINUS, // --
61+
5962
LTLT, // <<
6063
GTGT, // >>
6164
GTGTGT, // >>>

src/com/annimon/ownlang/parser/ast/AssignmentExpression.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* @author aNNiMON
88
*/
9-
public final class AssignmentExpression implements Expression {
9+
public final class AssignmentExpression implements Expression, Statement {
1010

1111
public final Accessible target;
1212
public final BinaryExpression.Operator operation;
@@ -17,6 +17,11 @@ public AssignmentExpression(BinaryExpression.Operator operation, Accessible targ
1717
this.target = target;
1818
this.expression = expr;
1919
}
20+
21+
@Override
22+
public void execute() {
23+
eval();
24+
}
2025

2126
@Override
2227
public Value eval() {

src/com/annimon/ownlang/parser/ast/FunctionalExpression.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* @author aNNiMON
1212
*/
13-
public final class FunctionalExpression implements Expression {
13+
public final class FunctionalExpression implements Expression, Statement {
1414

1515
public final Expression functionExpr;
1616
public final List<Expression> arguments;
@@ -24,6 +24,11 @@ public void addArgument(Expression arg) {
2424
arguments.add(arg);
2525
}
2626

27+
@Override
28+
public void execute() {
29+
eval();
30+
}
31+
2732
@Override
2833
public Value eval() {
2934
final int size = arguments.size();

src/com/annimon/ownlang/parser/ast/MatchExpression.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
* @author aNNiMON
1515
*/
16-
public final class MatchExpression implements Expression {
16+
public final class MatchExpression implements Expression, Statement {
1717

1818
public final Expression expression;
1919
public final List<Pattern> patterns;
@@ -23,6 +23,11 @@ public MatchExpression(Expression expression, List<Pattern> patterns) {
2323
this.patterns = patterns;
2424
}
2525

26+
@Override
27+
public void execute() {
28+
eval();
29+
}
30+
2631
@Override
2732
public Value eval() {
2833
final Value value = expression.eval();

src/com/annimon/ownlang/parser/ast/UnaryExpression.java

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@
88
*
99
* @author aNNiMON
1010
*/
11-
public final class UnaryExpression implements Expression {
12-
11+
public final class UnaryExpression implements Expression, Statement {
12+
1313
public static enum Operator {
14+
INCREMENT_PREFIX("++"),
15+
DECREMENT_PREFIX("--"),
16+
INCREMENT_POSTFIX("++"),
17+
DECREMENT_POSTFIX("--"),
1418
NEGATE("-"),
1519
// Boolean
1620
NOT("!"),
@@ -37,10 +41,41 @@ public UnaryExpression(Operator operation, Expression expr1) {
3741
this.expr1 = expr1;
3842
}
3943

44+
@Override
45+
public void execute() {
46+
eval();
47+
}
48+
4049
@Override
4150
public Value eval() {
4251
final Value value = expr1.eval();
4352
switch (operation) {
53+
case INCREMENT_PREFIX: {
54+
if (expr1 instanceof Accessible) {
55+
return ((Accessible) expr1).set(new NumberValue(value.asNumber() + 1));
56+
}
57+
return new NumberValue(value.asNumber() + 1);
58+
}
59+
case DECREMENT_PREFIX: {
60+
if (expr1 instanceof Accessible) {
61+
return ((Accessible) expr1).set(new NumberValue(value.asNumber() - 1));
62+
}
63+
return new NumberValue(value.asNumber() - 1);
64+
}
65+
case INCREMENT_POSTFIX: {
66+
if (expr1 instanceof Accessible) {
67+
((Accessible) expr1).set(new NumberValue(value.asNumber() + 1));
68+
return value;
69+
}
70+
return new NumberValue(value.asNumber() + 1);
71+
}
72+
case DECREMENT_POSTFIX: {
73+
if (expr1 instanceof Accessible) {
74+
((Accessible) expr1).set(new NumberValue(value.asNumber() - 1));
75+
return value;
76+
}
77+
return new NumberValue(value.asNumber() - 1);
78+
}
4479
case NEGATE: return new NumberValue(-value.asNumber());
4580
case COMPLEMENT: return new NumberValue(~(int)value.asNumber());
4681
case NOT: return new NumberValue(value.asNumber() != 0 ? 0 : 1);

0 commit comments

Comments
 (0)