From 1cb2f70aeedcdf456965cd3d823cc0b8a2bc2156 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 30 Jun 2016 00:03:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BE=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=82=D0=BE=D1=80=D1=8B=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/basics/loops.own | 10 ++++++++-- examples/basics/operator_overloading.own | 9 ++++++++- src/com/annimon/ownlang/parser/Lexer.java | 6 ++++++ src/com/annimon/ownlang/parser/Parser.java | 17 ++++++++++++++++- src/com/annimon/ownlang/parser/TokenType.java | 6 ++++++ .../ownlang/parser/ast/BinaryExpression.java | 8 +++++++- 6 files changed, 51 insertions(+), 5 deletions(-) diff --git a/examples/basics/loops.own b/examples/basics/loops.own index 3c69fa7..707f473 100644 --- a/examples/basics/loops.own +++ b/examples/basics/loops.own @@ -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 "" \ No newline at end of file +println "" + +// Range loop +println "\n\nRange loop" +for x : range(10) { + print x +} \ No newline at end of file diff --git a/examples/basics/operator_overloading.own b/examples/basics/operator_overloading.own index da644e5..9d3f0e1 100644 --- a/examples/basics/operator_overloading.own +++ b/examples/basics/operator_overloading.own @@ -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] \ No newline at end of file +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) +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/parser/Lexer.java b/src/com/annimon/ownlang/parser/Lexer.java index 8ad26ca..6c2e83e 100644 --- a/src/com/annimon/ownlang/parser/Lexer.java +++ b/src/com/annimon/ownlang/parser/Lexer.java @@ -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 KEYWORDS; diff --git a/src/com/annimon/ownlang/parser/Parser.java b/src/com/annimon/ownlang/parser/Parser.java index 8e85633..e80adde 100644 --- a/src/com/annimon/ownlang/parser/Parser.java +++ b/src/com/annimon/ownlang/parser/Parser.java @@ -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 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; } diff --git a/src/com/annimon/ownlang/parser/TokenType.java b/src/com/annimon/ownlang/parser/TokenType.java index 347e474..f949651 100644 --- a/src/com/annimon/ownlang/parser/TokenType.java +++ b/src/com/annimon/ownlang/parser/TokenType.java @@ -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, // ^ diff --git a/src/com/annimon/ownlang/parser/ast/BinaryExpression.java b/src/com/annimon/ownlang/parser/ast/BinaryExpression.java index 4259d11..347ceb8 100644 --- a/src/com/annimon/ownlang/parser/ast/BinaryExpression.java +++ b/src/com/annimon/ownlang/parser/ast/BinaryExpression.java @@ -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;