mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Добавлен инкремент и декремент
This commit is contained in:
parent
53cfe5d1e1
commit
5269d02a66
@ -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]
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -56,6 +56,9 @@ public enum TokenType {
|
||||
GTGTEQ, // >>=
|
||||
GTGTGTEQ, // >>>=
|
||||
|
||||
PLUSPLUS, // ++
|
||||
MINUSMINUS, // --
|
||||
|
||||
LTLT, // <<
|
||||
GTGT, // >>
|
||||
GTGTGT, // >>>
|
||||
|
@ -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() {
|
||||
|
@ -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<Expression> 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();
|
||||
|
@ -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<Pattern> 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();
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user