From fd0b8bd8170a8ecd21dd8567c8090b2b3f6657f5 Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 8 Jan 2016 21:58:20 +0200 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=20?= =?UTF-8?q?=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20=D0=BD=D0=B0=20=D1=84?= =?UTF-8?q?=D1=83=D0=BA=D0=BD=D1=86=D0=B8=D1=8E=20::?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + program.own | 1 + src/com/annimon/ownlang/parser/Lexer.java | 2 ++ src/com/annimon/ownlang/parser/Parser.java | 4 +++ src/com/annimon/ownlang/parser/TokenType.java | 3 +- .../ast/FunctionReferenceExpression.java | 31 +++++++++++++++++++ .../annimon/ownlang/parser/ast/Visitor.java | 1 + .../parser/visitors/AbstractVisitor.java | 12 +++++-- 8 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 .gitignore create mode 100644 src/com/annimon/ownlang/parser/ast/FunctionReferenceExpression.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..838458f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/dist/ \ No newline at end of file diff --git a/program.own b/program.own index b861f63..10fb83b 100644 --- a/program.own +++ b/program.own @@ -90,3 +90,4 @@ print "\n" print function(map["+"], 4, 5) print "\n" foreach(map, def(op, func) = echo (4, op, 5, "=", func(4,5))) +foreach(arr, ::echo) diff --git a/src/com/annimon/ownlang/parser/Lexer.java b/src/com/annimon/ownlang/parser/Lexer.java index e7b9353..fd845ce 100644 --- a/src/com/annimon/ownlang/parser/Lexer.java +++ b/src/com/annimon/ownlang/parser/Lexer.java @@ -45,6 +45,8 @@ public final class Lexer { OPERATORS.put("<=", TokenType.LTEQ); OPERATORS.put(">=", TokenType.GTEQ); + OPERATORS.put("::", TokenType.COLONCOLON); + OPERATORS.put("&&", TokenType.AMPAMP); OPERATORS.put("||", TokenType.BARBAR); diff --git a/src/com/annimon/ownlang/parser/Parser.java b/src/com/annimon/ownlang/parser/Parser.java index e009617..9fb830b 100644 --- a/src/com/annimon/ownlang/parser/Parser.java +++ b/src/com/annimon/ownlang/parser/Parser.java @@ -426,6 +426,10 @@ public final class Parser { if (match(TokenType.TEXT)) { return new ValueExpression(current.getText()); } + if (match(TokenType.COLONCOLON)) { + final String functionName = consume(TokenType.WORD).getText(); + return new FunctionReferenceExpression(functionName); + } if (match(TokenType.DEF)) { consume(TokenType.LPAREN); final List argNames = new ArrayList<>(); diff --git a/src/com/annimon/ownlang/parser/TokenType.java b/src/com/annimon/ownlang/parser/TokenType.java index 7d35816..bc2a392 100644 --- a/src/com/annimon/ownlang/parser/TokenType.java +++ b/src/com/annimon/ownlang/parser/TokenType.java @@ -51,7 +51,8 @@ public enum TokenType { QUESTION, // ? COLON, // : - + COLONCOLON, // :: + LPAREN, // ( RPAREN, // ) LBRACKET, // [ diff --git a/src/com/annimon/ownlang/parser/ast/FunctionReferenceExpression.java b/src/com/annimon/ownlang/parser/ast/FunctionReferenceExpression.java new file mode 100644 index 0000000..c60ea09 --- /dev/null +++ b/src/com/annimon/ownlang/parser/ast/FunctionReferenceExpression.java @@ -0,0 +1,31 @@ +package com.annimon.ownlang.parser.ast; + +import com.annimon.ownlang.lib.*; + +/** + * + * @author aNNiMON + */ +public final class FunctionReferenceExpression implements Expression { + + public final String name; + + public FunctionReferenceExpression(String name) { + this.name = name; + } + + @Override + public FunctionValue eval() { + return new FunctionValue(Functions.get(name)); + } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + + @Override + public String toString() { + return "::" + name; + } +} diff --git a/src/com/annimon/ownlang/parser/ast/Visitor.java b/src/com/annimon/ownlang/parser/ast/Visitor.java index 7f63d02..941609d 100644 --- a/src/com/annimon/ownlang/parser/ast/Visitor.java +++ b/src/com/annimon/ownlang/parser/ast/Visitor.java @@ -18,6 +18,7 @@ public interface Visitor { void visit(DoWhileStatement s); void visit(ForStatement s); void visit(FunctionDefineStatement s); + void visit(FunctionReferenceExpression e); void visit(FunctionStatement s); void visit(FunctionalExpression s); void visit(IfStatement s); diff --git a/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java b/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java index ca18f19..a87c0c4 100644 --- a/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java +++ b/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java @@ -2,6 +2,8 @@ package com.annimon.ownlang.parser.visitors; import com.annimon.ownlang.parser.ast.*; +import java.util.Map; + /** * * @author aNNiMON @@ -79,6 +81,10 @@ public abstract class AbstractVisitor implements Visitor { s.body.accept(this); } + @Override + public void visit(FunctionReferenceExpression e) { + } + @Override public void visit(FunctionStatement s) { s.function.accept(this); @@ -102,9 +108,9 @@ public abstract class AbstractVisitor implements Visitor { @Override public void visit(MapExpression s) { - for (Expression key : s.elements.keySet()) { - key.accept(this); - s.elements.get(key).accept(this); + for (Map.Entry entry : s.elements.entrySet()) { + entry.getKey().accept(this); + entry.getValue().accept(this); } }