Дополнительные операторы для перегрузки

This commit is contained in:
Victor 2016-06-30 00:03:31 +03:00
parent 3b0f1f009e
commit 1cb2f70aee
6 changed files with 51 additions and 5 deletions

View File

@ -44,9 +44,15 @@ foreach(arr, def(v) {
print v
})
println "\n\nfunctional loop on map"
println "\n\nFunctional loop on map"
foreach(object, ::echo)
foreach(object, def(k, v) {
print " " + k + " : " + v
})
println ""
println ""
// Range loop
println "\n\nRange loop"
for x : range(10) {
print x
}

View File

@ -1,3 +1,4 @@
use "std"
use "types"
use "math"
@ -8,4 +9,10 @@ println 1 :: 2 :: 3
def `^`(v1, v2) = pow(v1[0], v2[0])
print "[2] ^ [7] = "
println [2] ^ [7]
println [2] ^ [7]
def `..`(a, b) = range(a, b - 1)
def `**`(a, b) = int(pow(a, b))
for y : 1 .. 10 {
println sprintf("2 ^ %d = %d", y, 2 ** y)
}

View File

@ -75,6 +75,12 @@ public final class Lexer {
OPERATORS.put("<<", TokenType.LTLT);
OPERATORS.put(">>", TokenType.GTGT);
OPERATORS.put(">>>", TokenType.GTGTGT);
OPERATORS.put("@", TokenType.AT);
OPERATORS.put("@=", TokenType.ATEQ);
OPERATORS.put("..", TokenType.DOTDOT);
OPERATORS.put("**", TokenType.STARSTAR);
OPERATORS.put("?:", TokenType.QUESTIONCOLON);
}
private static final Map<String, TokenType> KEYWORDS;

View File

@ -43,6 +43,7 @@ public final class Parser {
assignOperator.put(TokenType.LTLTEQ, BinaryExpression.Operator.LSHIFT);
assignOperator.put(TokenType.GTGTEQ, BinaryExpression.Operator.RSHIFT);
assignOperator.put(TokenType.GTGTGTEQ, BinaryExpression.Operator.URSHIFT);
assignOperator.put(TokenType.ATEQ, BinaryExpression.Operator.AT);
}
private final List<Token> tokens;
@ -445,7 +446,9 @@ public final class Parser {
final Expression falseExpr = expression();
return new TernaryExpression(result, trueExpr, falseExpr);
}
if (match(TokenType.QUESTIONCOLON)) {
return new BinaryExpression(BinaryExpression.Operator.ELVIS, result, expression());
}
return result;
}
@ -574,6 +577,10 @@ public final class Parser {
expression = new BinaryExpression(BinaryExpression.Operator.URSHIFT, expression, additive());
continue;
}
if (match(TokenType.DOTDOT)) {
expression = new BinaryExpression(BinaryExpression.Operator.RANGE, expression, additive());
continue;
}
break;
}
@ -596,6 +603,10 @@ public final class Parser {
result = new BinaryExpression(BinaryExpression.Operator.PUSH, result, multiplicative());
continue;
}
if (match(TokenType.AT)) {
result = new BinaryExpression(BinaryExpression.Operator.AT, result, multiplicative());
continue;
}
break;
}
@ -618,6 +629,10 @@ public final class Parser {
result = new BinaryExpression(BinaryExpression.Operator.REMAINDER, result, unary());
continue;
}
if (match(TokenType.STARSTAR)) {
result = new BinaryExpression(BinaryExpression.Operator.POWER, result, unary());
continue;
}
break;
}

View File

@ -34,6 +34,7 @@ public enum TokenType {
STAR, // *
SLASH, // /
PERCENT,// %
AT, // @
EQ, // =
EQEQ, // ==
@ -49,6 +50,7 @@ public enum TokenType {
STAREQ, // *=
SLASHEQ, // /=
PERCENTEQ, // %=
ATEQ, // @=
AMPEQ, // &=
CARETEQ, // ^=
BAREQ, // |=
@ -63,6 +65,10 @@ public enum TokenType {
LTLT, // <<
GTGT, // >>
GTGTGT, // >>>
DOTDOT, // ..
STARSTAR, // **
QUESTIONCOLON, // ?:
TILDE, // ~
CARET, // ^

View File

@ -29,7 +29,13 @@ public final class BinaryExpression implements Expression {
XOR("^"),
LSHIFT("<<"),
RSHIFT(">>"),
URSHIFT(">>>");
URSHIFT(">>>"),
// Addition operators for future usage or overloading
AT("@"),
RANGE(".."),
POWER("**"),
ELVIS("?:");
private final String name;