diff --git a/.idea/misc.xml b/.idea/misc.xml
index ed2bc3c..0a13117 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,3 +1,4 @@
+
@@ -7,7 +8,7 @@
-
+
\ No newline at end of file
diff --git a/src/main/java/com/lemms/Canvas/Canvas.java b/src/main/java/com/lemms/Canvas/Canvas.java
new file mode 100644
index 0000000..eccf57c
--- /dev/null
+++ b/src/main/java/com/lemms/Canvas/Canvas.java
@@ -0,0 +1,68 @@
+package com.lemms.Canvas;
+
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class Canvas implements ActionListener {
+
+ public ScriptCallback update;
+
+ private final CanvasPanel panel;
+ private final JFrame frame;
+ private final Timer timer;
+
+ public Canvas(int tickRate, int width, int height) {
+ frame = new JFrame();
+ panel = new CanvasPanel();
+ frame.add(panel);
+ frame.pack();
+ frame.setLocationRelativeTo(null);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.setSize(width, height);
+ frame.setVisible(true);
+ update = panel::repaint;
+ timer = new Timer(tickRate, this);
+ }
+
+ public int getWidth() {
+ return frame.getWidth();
+ }
+
+ public int getHeight() {
+ return frame.getHeight();
+ }
+
+ public Rect getBounds() {return new Rect(0,0, getWidth(), getHeight(), null);}
+
+ public void run() {
+ timer.start();
+ }
+
+ public void quit() {
+ timer.stop();
+ }
+
+ public void add(Drawable drawable) {
+ panel.addElement(drawable);
+ }
+
+ public void remove(Drawable drawable) {panel.removeElement(drawable);}
+
+ public void clear() {panel.clearElements();}
+
+ public void repaint() {panel.repaint();}
+
+ public void onKeyPress(int key, ScriptCallback callback) {
+ panel.addKeyEvent(key, callback);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if ( e.getSource() == timer)
+ {
+ update.call();
+ }
+ }
+
+}
diff --git a/src/main/java/com/lemms/Canvas/CanvasPanel.java b/src/main/java/com/lemms/Canvas/CanvasPanel.java
new file mode 100644
index 0000000..dca409c
--- /dev/null
+++ b/src/main/java/com/lemms/Canvas/CanvasPanel.java
@@ -0,0 +1,59 @@
+package com.lemms.Canvas;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class CanvasPanel extends JPanel implements KeyListener {
+ private final List elements = new ArrayList<>();
+ private final HashMap keyEvents = new HashMap<>();
+
+ public CanvasPanel() {
+ setFocusable(true);
+ requestFocusInWindow();
+ addKeyListener(this);
+ }
+
+ public void addElement(Drawable d) {
+ elements.add(d);
+ }
+
+ public void removeElement(Drawable d) {
+ elements.remove(d);
+ }
+
+ public void clearElements() {
+ elements.clear();
+ }
+
+ public void addKeyEvent(int key, ScriptCallback callback) {
+ keyEvents.put(key, callback);
+ }
+
+ @Override
+ protected void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ for (Drawable d : elements) {
+ d.draw(g);
+ }
+ }
+
+ @Override
+ public void keyTyped(KeyEvent e) {
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if(keyEvents.containsKey(e.getKeyCode())) {
+ keyEvents.get(e.getKeyCode()).call();
+ }
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ }
+}
diff --git a/src/main/java/com/lemms/Canvas/Collidable.java b/src/main/java/com/lemms/Canvas/Collidable.java
new file mode 100644
index 0000000..0c4a2bd
--- /dev/null
+++ b/src/main/java/com/lemms/Canvas/Collidable.java
@@ -0,0 +1,11 @@
+package com.lemms.Canvas;
+
+public interface Collidable {
+ int getX();
+ int getY();
+ int getWidth();
+ int getHeight();
+
+ boolean intersects(Collidable other);
+ boolean contains(Collidable other);
+}
diff --git a/src/main/java/com/lemms/Canvas/Drawable.java b/src/main/java/com/lemms/Canvas/Drawable.java
new file mode 100644
index 0000000..bf3a33d
--- /dev/null
+++ b/src/main/java/com/lemms/Canvas/Drawable.java
@@ -0,0 +1,7 @@
+package com.lemms.Canvas;
+
+import java.awt.*;
+
+public interface Drawable {
+ void draw(Graphics g);
+}
diff --git a/src/main/java/com/lemms/Canvas/Pixel.java b/src/main/java/com/lemms/Canvas/Pixel.java
new file mode 100644
index 0000000..7dcf787
--- /dev/null
+++ b/src/main/java/com/lemms/Canvas/Pixel.java
@@ -0,0 +1,26 @@
+package com.lemms.Canvas;
+
+import java.awt.*;
+
+public class Pixel implements Drawable {
+ private int x, y;
+ private Color color;
+
+ public Pixel(int x, int y, Color color) {
+ this.x = x; this.y = y; this.color = color;
+ }
+
+ public int getX() {return x;}
+ public int getY() {return y;}
+ public Color getColor() {return color;}
+
+ public void setX(int x) {this.x = x;}
+ public void setY(int y) {this.y = y;}
+ public void setColor(Color color) {this.color = color;}
+
+ @Override
+ public void draw(Graphics g) {
+ g.setColor(color);
+ g.fillRect(x, y, 1, 1); // Or larger if needed
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/lemms/Canvas/Rect.java b/src/main/java/com/lemms/Canvas/Rect.java
new file mode 100644
index 0000000..613505c
--- /dev/null
+++ b/src/main/java/com/lemms/Canvas/Rect.java
@@ -0,0 +1,60 @@
+package com.lemms.Canvas;
+
+import java.awt.*;
+
+public class Rect implements Drawable, Collidable {
+ private int x, y, width, height;
+ private Color color;
+
+ public Rect(int x, int y, int w, int h, Color color) {
+ this.x = x;
+ this.y = y;
+ this.width = w;
+ this.height = h;
+ this.color = color;
+ }
+
+ @Override
+ public void draw(Graphics g) {
+ g.setColor(color);
+ g.fillRect(x, y, width, height);
+ }
+
+ public Color getColor() {return color;}
+
+ @Override
+ public int getX() {return x;}
+ @Override
+ public int getY() {return y;}
+ @Override
+ public int getWidth() {return width;}
+ @Override
+ public int getHeight() {return height;}
+
+ public void setX(int x) {this.x = x;}
+ public void setY(int y) {this.y = y;}
+ public void setWidth(int w) {this.width = w;}
+ public void setHeight(int h) {this.height = h;}
+
+ @Override
+ public boolean intersects(Collidable other) {
+ if (other == null) {
+ return false;
+ }
+ return this.x < other.getX() + other.getWidth()
+ && this.x + this.width > other.getX()
+ && this.y < other.getY() + other.getHeight()
+ && this.y + this.height > other.getY();
+ }
+
+ @Override
+ public boolean contains(Collidable other) {
+ if (other == null) {
+ return false;
+ }
+ return other.getX() >= this.x
+ && other.getY() >= this.y
+ && other.getX() + other.getWidth() <= this.x + this.width
+ && other.getY() + other.getWidth() <= this.y + this.height;
+ }
+}
diff --git a/src/main/java/com/lemms/Canvas/ScriptCallback.java b/src/main/java/com/lemms/Canvas/ScriptCallback.java
new file mode 100644
index 0000000..2e0c5a1
--- /dev/null
+++ b/src/main/java/com/lemms/Canvas/ScriptCallback.java
@@ -0,0 +1,5 @@
+package com.lemms.Canvas;
+
+public interface ScriptCallback {
+ void call();
+}
diff --git a/src/main/java/com/lemms/Canvas/Snake.java b/src/main/java/com/lemms/Canvas/Snake.java
new file mode 100644
index 0000000..7798243
--- /dev/null
+++ b/src/main/java/com/lemms/Canvas/Snake.java
@@ -0,0 +1,105 @@
+package com.lemms.Canvas;
+
+import java.awt.*;
+import java.awt.event.KeyEvent;
+import java.util.ArrayList;
+import java.util.Random;
+
+public class Snake {
+ public static void main(String[] args) {
+ //create canvas with single snake cell
+ Canvas canvas = new Canvas(500, 500,500);
+ ArrayList snake = new ArrayList<>(){};
+ snake.add(new Rect(0,0, 20,20, Color.BLUE));
+
+ //generate food at random location
+ int gridWidth = canvas.getWidth()/20;
+ int gridHeight = canvas.getHeight()/20;
+
+ Random random = new Random();
+ int food_x = random.nextInt(gridWidth-1)*20;
+ int food_y = random.nextInt(gridHeight-1)*20;
+ Rect food = new Rect(food_x, food_y, 20, 20, Color.RED);
+
+ canvas.run();
+ canvas.add(snake.get(0));
+ canvas.add(food);
+
+ int[] dir = {1, 0};
+
+ canvas.onKeyPress(KeyEvent.VK_W, ()->{
+ dir[0] = 0;
+ dir[1] = -1;
+ });
+ canvas.onKeyPress(KeyEvent.VK_A, ()->{
+ dir[0] = -1;
+ dir[1] = 0;
+ });
+ canvas.onKeyPress(KeyEvent.VK_S, ()->{
+ dir[0] = 0;
+ dir[1] = 1;
+ });
+ canvas.onKeyPress(KeyEvent.VK_D, ()->{
+ dir[0] = 1;
+ dir[1] = 0;
+ });
+
+ canvas.update = () -> {
+ // Compute next head position
+ Rect oldHead = snake.get(0);
+ int newX = oldHead.getX() + dir[0]*20;
+ int newY = oldHead.getY() + dir[1]*20;
+ Rect newHead = new Rect(newX, newY, 20, 20, Color.BLUE);
+
+ // Check wall collision
+ if (!canvas.getBounds().contains(newHead)) {
+ GameOver(canvas, snake, false);
+ return;
+ }
+
+ // Self‐collision
+ for (Rect segment : snake) {
+ if (segment.getX() == newX && segment.getY() == newY) {
+ // game over
+ GameOver(canvas, snake, false);
+ return;
+ }
+ }
+
+ // Add head to front
+ snake.add(0, newHead);
+ canvas.add(newHead);
+
+ boolean ate = newHead.intersects(food);
+ if (ate) {
+ // move the food
+ food.setX(random.nextInt(gridWidth-1)*20);
+ food.setY(random.nextInt(gridHeight-1)*20);
+
+ if(snake.size() == gridHeight*gridWidth) {
+ GameOver(canvas, snake, true);
+ }
+ }
+
+ if (!ate) {
+ Rect tail = snake.remove(snake.size() - 1);
+ canvas.remove(tail);
+ }
+
+ canvas.repaint();
+ };
+ }
+
+ private static void GameOver(Canvas canvas, ArrayList snake, boolean won) {
+ canvas.clear();
+ snake.clear();
+ String text = won ? "Game Won!" : "Game Over!";
+ Text GameOver = new Text(text,canvas.getWidth()/2, canvas.getHeight()/2, 72,
+ Color.BLACK);
+ GameOver.align(0,0);
+ canvas.add(GameOver);
+ canvas.repaint();
+ canvas.quit();
+ }
+
+}
diff --git a/src/main/java/com/lemms/Canvas/Text.java b/src/main/java/com/lemms/Canvas/Text.java
new file mode 100644
index 0000000..00bbf86
--- /dev/null
+++ b/src/main/java/com/lemms/Canvas/Text.java
@@ -0,0 +1,73 @@
+package com.lemms.Canvas;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+
+public class Text implements Drawable {
+ private String text;
+ private int x;
+ private int y;
+ private int size;
+ private Color color;
+
+ // Alignment factors: -1 = top/left, 0 = center, +1 = bottom/right
+ private float alignX = -1f;
+ private float alignY = -1f;
+
+ public Text(String text, int x, int y, int size, Color color) {
+ this.text = text;
+ this.x = x;
+ this.y = y;
+ this.size = size;
+ this.color = color;
+ }
+
+ public void align(float alignX, float alignY) {
+ this.alignX = alignX;
+ this.alignY = alignY;
+ }
+
+ // Getter and Setter
+
+ public String getText() { return text; }
+ public int getX() { return x; }
+ public int getY() { return y; }
+ public int getSize() { return size; }
+ public Color getColor() { return color; }
+
+ public void setText(String text) { this.text = text; }
+ public void setX(int x) { this.x = x; }
+ public void setY(int y) { this.y = y; }
+ public void setSize(int size) { this.size = size; }
+ public void setColor(Color color) { this.color = color; }
+
+ public void draw(Graphics g) {
+ Font oldFont = g.getFont();
+ Color oldColor = g.getColor();
+
+ // Apply font size
+ Font newFont = oldFont.deriveFont((float) size);
+ g.setFont(newFont);
+ g.setColor(color);
+
+ // Measure text
+ FontMetrics fm = g.getFontMetrics(newFont);
+ int textWidth = fm.stringWidth(text);
+ int textHeight = fm.getHeight();
+
+ // Compute offsets: (-1 -> 0, 0 -> 0.5, +1 -> 1)
+ float fx = (alignX + 1f) / 2f;
+ float fy = (alignY + 1f) / 2f;
+ int offsetX = Math.round(fx * textWidth);
+ int offsetY = Math.round(fy * textHeight);
+
+ // Draw at reference point minus offset
+ g.drawString(text, x - offsetX, y - offsetY);
+
+ // Restore graphics state
+ g.setFont(oldFont);
+ g.setColor(oldColor);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/lemms/Exceptions/LemmsRuntimeException.java b/src/main/java/com/lemms/Exceptions/LemmsRuntimeException.java
index 085ebf0..de19a2d 100644
--- a/src/main/java/com/lemms/Exceptions/LemmsRuntimeException.java
+++ b/src/main/java/com/lemms/Exceptions/LemmsRuntimeException.java
@@ -10,6 +10,11 @@ public LemmsRuntimeException(Token token, String message) {
this.token = token;
}
+ public LemmsRuntimeException(String message) {
+ super(message);
+ token = null;
+ }
+
public Token getToken() {
return token;
}
diff --git a/src/main/java/com/lemms/Lemms.java b/src/main/java/com/lemms/Lemms.java
index 021911a..699fc50 100644
--- a/src/main/java/com/lemms/Lemms.java
+++ b/src/main/java/com/lemms/Lemms.java
@@ -41,6 +41,7 @@ public static void main(String[] args) {
exit(1);
}
+
//Verknüpfung: Tokenizer + Parser + Interpreter
Tokenizer t = new Tokenizer(sourceFile);
Parser p = new Parser(t.getTokens());
diff --git a/src/main/java/com/lemms/SyntaxNode/AssignmentNode.java b/src/main/java/com/lemms/SyntaxNode/AssignmentNode.java
index 7e587a6..25ae3f7 100644
--- a/src/main/java/com/lemms/SyntaxNode/AssignmentNode.java
+++ b/src/main/java/com/lemms/SyntaxNode/AssignmentNode.java
@@ -5,10 +5,10 @@
import com.lemms.interpreter.StatementVisitor;
public class AssignmentNode extends StatementNode {
- public VariableNode leftHandSide;
+ public ExpressionNode leftHandSide;
public ExpressionNode rightHandSide;
- public AssignmentNode(VariableNode identifier, ExpressionNode expression) {
+ public AssignmentNode(ExpressionNode identifier, ExpressionNode expression) {
this.leftHandSide = identifier;
this.rightHandSide = expression;
}
diff --git a/src/main/java/com/lemms/SyntaxNode/ClassDeclarationNode.java b/src/main/java/com/lemms/SyntaxNode/ClassDeclarationNode.java
index d4b9572..0db1a6b 100644
--- a/src/main/java/com/lemms/SyntaxNode/ClassDeclarationNode.java
+++ b/src/main/java/com/lemms/SyntaxNode/ClassDeclarationNode.java
@@ -11,9 +11,10 @@ public class ClassDeclarationNode extends StatementNode{
public String className;
// list of the names of the local variables in this class
public List localVariables;
+ public List localFunctions;
public FlowSignal accept(StatementVisitor visitor) {
visitor.visitClassDeclarationStatement(this);
- return null; // Function declarations do not return a FlowSignal
+ return null; // Class declarations do not return a FlowSignal
}
}
diff --git a/src/main/java/com/lemms/SyntaxNode/ExpressionNode.java b/src/main/java/com/lemms/SyntaxNode/ExpressionNode.java
index a75316c..6bac83a 100644
--- a/src/main/java/com/lemms/SyntaxNode/ExpressionNode.java
+++ b/src/main/java/com/lemms/SyntaxNode/ExpressionNode.java
@@ -1,9 +1,10 @@
package com.lemms.SyntaxNode;
import com.lemms.interpreter.ValueVisitor;
+import com.lemms.interpreter.object.LemmsData;
public abstract class ExpressionNode extends Node {
- public abstract Object accept(ValueVisitor visitor);
+ public abstract LemmsData accept(ValueVisitor visitor);
}
diff --git a/src/main/java/com/lemms/SyntaxNode/FunctionCallNode.java b/src/main/java/com/lemms/SyntaxNode/FunctionCallNode.java
index 4dd0436..cd6a5c9 100644
--- a/src/main/java/com/lemms/SyntaxNode/FunctionCallNode.java
+++ b/src/main/java/com/lemms/SyntaxNode/FunctionCallNode.java
@@ -3,6 +3,7 @@
import java.util.List;
import com.lemms.interpreter.ValueVisitor;
+import com.lemms.interpreter.object.LemmsData;
public class FunctionCallNode extends ExpressionNode {
@@ -10,7 +11,7 @@ public class FunctionCallNode extends ExpressionNode {
public List params;
@Override
- public Object accept(ValueVisitor visitor) {
+ public LemmsData accept(ValueVisitor visitor) {
return visitor.visitFunctionCallValue(this);
}
diff --git a/src/main/java/com/lemms/SyntaxNode/FunctionCallStatementNode.java b/src/main/java/com/lemms/SyntaxNode/FunctionCallStatementNode.java
index 1eb53f6..a08ce54 100644
--- a/src/main/java/com/lemms/SyntaxNode/FunctionCallStatementNode.java
+++ b/src/main/java/com/lemms/SyntaxNode/FunctionCallStatementNode.java
@@ -9,6 +9,7 @@
public class FunctionCallStatementNode extends StatementNode {
public FunctionCallNode functionCall;
+ public ExpressionNode expression;
@Override
public FlowSignal accept(StatementVisitor visitor) {
diff --git a/src/main/java/com/lemms/SyntaxNode/LiteralNode.java b/src/main/java/com/lemms/SyntaxNode/LiteralNode.java
index 37f8c9d..6e1092b 100644
--- a/src/main/java/com/lemms/SyntaxNode/LiteralNode.java
+++ b/src/main/java/com/lemms/SyntaxNode/LiteralNode.java
@@ -2,6 +2,7 @@
import com.lemms.Token;
import com.lemms.interpreter.ValueVisitor;
+import com.lemms.interpreter.object.LemmsData;
public class LiteralNode extends ExpressionNode {
public final Object value;
@@ -19,7 +20,7 @@ public LiteralNode(boolean value) {
}
@Override
- public Object accept(ValueVisitor visitor) {
+ public LemmsData accept(ValueVisitor visitor) {
return visitor.visitLiteralValue(this);
}
}
diff --git a/src/main/java/com/lemms/SyntaxNode/MemberAccessNode.java b/src/main/java/com/lemms/SyntaxNode/MemberAccessNode.java
new file mode 100644
index 0000000..afc075c
--- /dev/null
+++ b/src/main/java/com/lemms/SyntaxNode/MemberAccessNode.java
@@ -0,0 +1,21 @@
+package com.lemms.SyntaxNode;
+
+import com.lemms.interpreter.ValueVisitor;
+import com.lemms.interpreter.object.LemmsData;
+
+public class MemberAccessNode extends ExpressionNode {
+
+ public ExpressionNode object; // The base object (could be another MemberAccessNode, FunctionCallNode,
+ // VariableNode, etc.)
+ public MemberAccessNode child; // The next access/call in the chain, or null
+
+ public MemberAccessNode(ExpressionNode object, MemberAccessNode child) {
+ this.object = object;
+ this.child = child;
+ }
+
+ @Override
+ public LemmsData accept(ValueVisitor visitor) {
+ return visitor.visitMemberAccessValue(this);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/lemms/SyntaxNode/OperatorNode.java b/src/main/java/com/lemms/SyntaxNode/OperatorNode.java
index 45f7b45..dffc41a 100644
--- a/src/main/java/com/lemms/SyntaxNode/OperatorNode.java
+++ b/src/main/java/com/lemms/SyntaxNode/OperatorNode.java
@@ -2,6 +2,7 @@
import com.lemms.Token;
import com.lemms.interpreter.ValueVisitor;
+import com.lemms.interpreter.object.LemmsData;
public class OperatorNode extends ExpressionNode {
@@ -17,7 +18,7 @@ public OperatorNode(ExpressionNode left, Token operator, ExpressionNode right) {
}
@Override
- public Object accept(ValueVisitor visitor) {
+ public LemmsData accept(ValueVisitor visitor) {
return visitor.visitOperatorValue(this);
}
}
diff --git a/src/main/java/com/lemms/SyntaxNode/VariableNode.java b/src/main/java/com/lemms/SyntaxNode/VariableNode.java
index 22712f3..be9e8f0 100644
--- a/src/main/java/com/lemms/SyntaxNode/VariableNode.java
+++ b/src/main/java/com/lemms/SyntaxNode/VariableNode.java
@@ -3,26 +3,17 @@
import com.lemms.Token;
import com.lemms.TokenType;
import com.lemms.interpreter.ValueVisitor;
+import com.lemms.interpreter.object.LemmsData;
-public class VariableNode extends ExpressionNode{
+public class VariableNode extends ExpressionNode {
public String name;
- public Token token; //Line
-
- public VariableNode(Token identifierToken) {
- if (identifierToken == null || identifierToken.getType() != TokenType.IDENTIFIER) {
- throw new IllegalArgumentException("VariableNode muss mit einem IDENTIFIER-Token erstellt werden.");
- }
-
- this.name = identifierToken.getValue();
- this.token = identifierToken; //Line
- }
public VariableNode(String identifierName) {
this.name = identifierName;
}
-
+
@Override
- public Object accept(ValueVisitor visitor) {
+ public LemmsData accept(ValueVisitor visitor) {
return visitor.visitVariableValue(this);
}
}
diff --git a/src/main/java/com/lemms/Token.java b/src/main/java/com/lemms/Token.java
index 3a9b329..26a98ee 100644
--- a/src/main/java/com/lemms/Token.java
+++ b/src/main/java/com/lemms/Token.java
@@ -17,6 +17,12 @@ public Token(TokenType type, String value, int line) {
this.line = line;
}
+ public Token(TokenType type, String value) {
+ this.type = type;
+ this.value = value;
+ this.line = 0;
+ }
+
public Token(TokenType type) {
this.type = type;
this.value = null;
diff --git a/src/main/java/com/lemms/TokenType.java b/src/main/java/com/lemms/TokenType.java
index e834b7d..a6a2a83 100644
--- a/src/main/java/com/lemms/TokenType.java
+++ b/src/main/java/com/lemms/TokenType.java
@@ -40,5 +40,6 @@ public enum TokenType {
IF,
ELSE,
- COMMA
+ COMMA,
+ DOT
}
\ No newline at end of file
diff --git a/src/main/java/com/lemms/Tokenizer.java b/src/main/java/com/lemms/Tokenizer.java
index d1c0e8a..e82d82c 100644
--- a/src/main/java/com/lemms/Tokenizer.java
+++ b/src/main/java/com/lemms/Tokenizer.java
@@ -74,6 +74,7 @@ private void scanToken() {
case '/': index++; addToken(DIVISION); return;
case '%': index++; addToken(MODULO); return;
case ',': index++; addToken(COMMA); return;
+ case '.': index++; addToken(DOT); return;
case '#':
index++; //evtl 2x incremte
while (index + 1 <= input_file.length())
diff --git a/src/main/java/com/lemms/api/LemmsAPI.java b/src/main/java/com/lemms/api/LemmsAPI.java
index d983ebf..f2c6cbc 100644
--- a/src/main/java/com/lemms/api/LemmsAPI.java
+++ b/src/main/java/com/lemms/api/LemmsAPI.java
@@ -11,12 +11,13 @@
import com.lemms.Tokenizer;
import com.lemms.SyntaxNode.StatementNode;
import com.lemms.interpreter.Interpreter;
+import com.lemms.interpreter.object.LemmsData;
import com.lemms.parser.Parser;
public class LemmsAPI {
private HashMap nativeFunctions;
private List program;
- public void registerFunction(String name, Function, Object> function) {
+ public void registerFunction(String name, Function, LemmsData> function) {
nativeFunctions.put(name, function::apply);
}
diff --git a/src/main/java/com/lemms/api/NativeFunction.java b/src/main/java/com/lemms/api/NativeFunction.java
index 87885ac..ec82668 100644
--- a/src/main/java/com/lemms/api/NativeFunction.java
+++ b/src/main/java/com/lemms/api/NativeFunction.java
@@ -2,6 +2,8 @@
import java.util.List;
+import com.lemms.interpreter.object.LemmsData;
+
@FunctionalInterface
public interface NativeFunction {
/**
@@ -10,5 +12,5 @@ public interface NativeFunction {
* @return A result object (or null) to return back into the script.
* @throws RuntimeException if something goes wrong in the host side.
*/
- Object apply(List