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, 5, 2]
|
||||||
xarr[0] += xarr[1]
|
xarr[0] += xarr[1]
|
||||||
xarr[0] *= xarr[2]
|
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.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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,6 +56,9 @@ public enum TokenType {
|
|||||||
GTGTEQ, // >>=
|
GTGTEQ, // >>=
|
||||||
GTGTGTEQ, // >>>=
|
GTGTGTEQ, // >>>=
|
||||||
|
|
||||||
|
PLUSPLUS, // ++
|
||||||
|
MINUSMINUS, // --
|
||||||
|
|
||||||
LTLT, // <<
|
LTLT, // <<
|
||||||
GTGT, // >>
|
GTGT, // >>
|
||||||
GTGTGT, // >>>
|
GTGTGT, // >>>
|
||||||
|
@ -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;
|
||||||
@ -17,6 +17,11 @@ public final class AssignmentExpression implements Expression {
|
|||||||
this.target = target;
|
this.target = target;
|
||||||
this.expression = expr;
|
this.expression = expr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute() {
|
||||||
|
eval();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Value eval() {
|
public Value eval() {
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user