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
29a80a7bfe
commit
fd0b8bd817
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/dist/
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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<String> argNames = new ArrayList<>();
|
||||
|
@ -51,6 +51,7 @@ public enum TokenType {
|
||||
|
||||
QUESTION, // ?
|
||||
COLON, // :
|
||||
COLONCOLON, // ::
|
||||
|
||||
LPAREN, // (
|
||||
RPAREN, // )
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
@ -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<Expression, Expression> entry : s.elements.entrySet()) {
|
||||
entry.getKey().accept(this);
|
||||
entry.getValue().accept(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user