mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Дополнительные операторы для перегрузки
This commit is contained in:
parent
3b0f1f009e
commit
1cb2f70aee
@ -44,9 +44,15 @@ foreach(arr, def(v) {
|
|||||||
print v
|
print v
|
||||||
})
|
})
|
||||||
|
|
||||||
println "\n\nfunctional loop on map"
|
println "\n\nFunctional loop on map"
|
||||||
foreach(object, ::echo)
|
foreach(object, ::echo)
|
||||||
foreach(object, def(k, v) {
|
foreach(object, def(k, v) {
|
||||||
print " " + k + " : " + v
|
print " " + k + " : " + v
|
||||||
})
|
})
|
||||||
println ""
|
println ""
|
||||||
|
|
||||||
|
// Range loop
|
||||||
|
println "\n\nRange loop"
|
||||||
|
for x : range(10) {
|
||||||
|
print x
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
use "std"
|
||||||
use "types"
|
use "types"
|
||||||
use "math"
|
use "math"
|
||||||
|
|
||||||
@ -9,3 +10,9 @@ println 1 :: 2 :: 3
|
|||||||
def `^`(v1, v2) = pow(v1[0], v2[0])
|
def `^`(v1, v2) = pow(v1[0], v2[0])
|
||||||
print "[2] ^ [7] = "
|
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)
|
||||||
|
}
|
@ -75,6 +75,12 @@ public final class Lexer {
|
|||||||
OPERATORS.put("<<", TokenType.LTLT);
|
OPERATORS.put("<<", TokenType.LTLT);
|
||||||
OPERATORS.put(">>", TokenType.GTGT);
|
OPERATORS.put(">>", TokenType.GTGT);
|
||||||
OPERATORS.put(">>>", TokenType.GTGTGT);
|
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;
|
private static final Map<String, TokenType> KEYWORDS;
|
||||||
|
@ -43,6 +43,7 @@ public final class Parser {
|
|||||||
assignOperator.put(TokenType.LTLTEQ, BinaryExpression.Operator.LSHIFT);
|
assignOperator.put(TokenType.LTLTEQ, BinaryExpression.Operator.LSHIFT);
|
||||||
assignOperator.put(TokenType.GTGTEQ, BinaryExpression.Operator.RSHIFT);
|
assignOperator.put(TokenType.GTGTEQ, BinaryExpression.Operator.RSHIFT);
|
||||||
assignOperator.put(TokenType.GTGTGTEQ, BinaryExpression.Operator.URSHIFT);
|
assignOperator.put(TokenType.GTGTGTEQ, BinaryExpression.Operator.URSHIFT);
|
||||||
|
assignOperator.put(TokenType.ATEQ, BinaryExpression.Operator.AT);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final List<Token> tokens;
|
private final List<Token> tokens;
|
||||||
@ -445,7 +446,9 @@ public final class Parser {
|
|||||||
final Expression falseExpr = expression();
|
final Expression falseExpr = expression();
|
||||||
return new TernaryExpression(result, trueExpr, falseExpr);
|
return new TernaryExpression(result, trueExpr, falseExpr);
|
||||||
}
|
}
|
||||||
|
if (match(TokenType.QUESTIONCOLON)) {
|
||||||
|
return new BinaryExpression(BinaryExpression.Operator.ELVIS, result, expression());
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -574,6 +577,10 @@ public final class Parser {
|
|||||||
expression = new BinaryExpression(BinaryExpression.Operator.URSHIFT, expression, additive());
|
expression = new BinaryExpression(BinaryExpression.Operator.URSHIFT, expression, additive());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (match(TokenType.DOTDOT)) {
|
||||||
|
expression = new BinaryExpression(BinaryExpression.Operator.RANGE, expression, additive());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -596,6 +603,10 @@ public final class Parser {
|
|||||||
result = new BinaryExpression(BinaryExpression.Operator.PUSH, result, multiplicative());
|
result = new BinaryExpression(BinaryExpression.Operator.PUSH, result, multiplicative());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (match(TokenType.AT)) {
|
||||||
|
result = new BinaryExpression(BinaryExpression.Operator.AT, result, multiplicative());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -618,6 +629,10 @@ public final class Parser {
|
|||||||
result = new BinaryExpression(BinaryExpression.Operator.REMAINDER, result, unary());
|
result = new BinaryExpression(BinaryExpression.Operator.REMAINDER, result, unary());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (match(TokenType.STARSTAR)) {
|
||||||
|
result = new BinaryExpression(BinaryExpression.Operator.POWER, result, unary());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ public enum TokenType {
|
|||||||
STAR, // *
|
STAR, // *
|
||||||
SLASH, // /
|
SLASH, // /
|
||||||
PERCENT,// %
|
PERCENT,// %
|
||||||
|
AT, // @
|
||||||
|
|
||||||
EQ, // =
|
EQ, // =
|
||||||
EQEQ, // ==
|
EQEQ, // ==
|
||||||
@ -49,6 +50,7 @@ public enum TokenType {
|
|||||||
STAREQ, // *=
|
STAREQ, // *=
|
||||||
SLASHEQ, // /=
|
SLASHEQ, // /=
|
||||||
PERCENTEQ, // %=
|
PERCENTEQ, // %=
|
||||||
|
ATEQ, // @=
|
||||||
AMPEQ, // &=
|
AMPEQ, // &=
|
||||||
CARETEQ, // ^=
|
CARETEQ, // ^=
|
||||||
BAREQ, // |=
|
BAREQ, // |=
|
||||||
@ -64,6 +66,10 @@ public enum TokenType {
|
|||||||
GTGT, // >>
|
GTGT, // >>
|
||||||
GTGTGT, // >>>
|
GTGTGT, // >>>
|
||||||
|
|
||||||
|
DOTDOT, // ..
|
||||||
|
STARSTAR, // **
|
||||||
|
QUESTIONCOLON, // ?:
|
||||||
|
|
||||||
TILDE, // ~
|
TILDE, // ~
|
||||||
CARET, // ^
|
CARET, // ^
|
||||||
BAR, // |
|
BAR, // |
|
||||||
|
@ -29,7 +29,13 @@ public final class BinaryExpression implements Expression {
|
|||||||
XOR("^"),
|
XOR("^"),
|
||||||
LSHIFT("<<"),
|
LSHIFT("<<"),
|
||||||
RSHIFT(">>"),
|
RSHIFT(">>"),
|
||||||
URSHIFT(">>>");
|
URSHIFT(">>>"),
|
||||||
|
|
||||||
|
// Addition operators for future usage or overloading
|
||||||
|
AT("@"),
|
||||||
|
RANGE(".."),
|
||||||
|
POWER("**"),
|
||||||
|
ELVIS("?:");
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user