Skip to content

Commit

Permalink
First commit with Eval
Browse files Browse the repository at this point in the history
  • Loading branch information
madsravn committed Oct 30, 2023
1 parent 5b2b9c5 commit 7919fb0
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 0 deletions.
32 changes: 32 additions & 0 deletions src/main/java/dk/madsravn/interpreter/evaluator/Evaluator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package dk.madsravn.interpreter.evaluator;

import dk.madsravn.interpreter.ast.*;
import dk.madsravn.interpreter.object.IObject;
import dk.madsravn.interpreter.object.IntegerObject;

import java.util.List;

public class Evaluator {

public static IObject evaluate(INode node) {
// TODO: Ugly?
if(node instanceof IntegerLiteral) {
// TODO: Ugly?
return new IntegerObject(((IntegerLiteral) node).getValue());
}
if(node instanceof ExpressionStatement) {
return evaluate(((ExpressionStatement)node).getExpression());
}
if(node instanceof Program) {
return evaluateStatements(((Program)node).getStatements());
}
return null;
}

private static IObject evaluateStatements(List<IStatement> statements) {
for(IStatement statement : statements) {
return evaluate(statement);
}
return null;
}
}
14 changes: 14 additions & 0 deletions src/main/java/dk/madsravn/interpreter/object/BooleanObject.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package dk.madsravn.interpreter.object;

public class BooleanObject implements IObject {
private boolean value;

public String type() {
return "BOOLEAN";
}

public String inspect() {
return "" + value;
}
}

7 changes: 7 additions & 0 deletions src/main/java/dk/madsravn/interpreter/object/IObject.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package dk.madsravn.interpreter.object;

public interface IObject {
String type();
String inspect();

}
25 changes: 25 additions & 0 deletions src/main/java/dk/madsravn/interpreter/object/IntegerObject.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package dk.madsravn.interpreter.object;

public class IntegerObject implements IObject {
private int value;

public IntegerObject(int value) {
this.value = value;
}

public int getValue() {
return value;
}

@Override
public String inspect() {
return "" + value;
}

// TODO: Create enum for this.
@Override
public String type() {
return "INTEGER";
}

}
14 changes: 14 additions & 0 deletions src/main/java/dk/madsravn/interpreter/object/NullObject.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package dk.madsravn.interpreter.object;

public class NullObject implements IObject {
@Override
public String type() {
return "NULL";
}

@Override
public String inspect() {
return "null";
}

}
55 changes: 55 additions & 0 deletions src/test/java/dk/madsravn/interpreter/evaluator/EvaluatorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package dk.madsravn.interpreter.evaluator;

import dk.madsravn.interpreter.ast.Program;
import dk.madsravn.interpreter.lexer.Lexer;
import dk.madsravn.interpreter.object.IObject;
import dk.madsravn.interpreter.object.IntegerObject;
import dk.madsravn.interpreter.parser.Parser;
import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.List;

import static dk.madsravn.interpreter.evaluator.Evaluator.evaluate;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class EvaluatorTest {

//TODO: Use record instead. Then we get all of this
private class EvalIntegerData {
public String input;
public int value;
public EvalIntegerData(String input, int value) {
this.input = input;
this.value = value;
}
}

@Test
public void testEvalIntegerExpression() {
List<EvalIntegerData> inputs = Arrays.asList(
new EvalIntegerData("5", 5),
new EvalIntegerData("10", 10)
);

for(EvalIntegerData input : inputs) {
IObject object = testEval(input.input);
testIntegerObject(object, input.value);
}
}

private void testIntegerObject(IObject object, int expected) {
assertTrue(object instanceof IntegerObject);
IntegerObject integerObject = (IntegerObject) object;
assertEquals(integerObject.getValue(), expected);
}

private IObject testEval(String input) {
Lexer lexer = new Lexer(input);
Parser parser = new Parser(lexer);
Program program = parser.parseProgram();

return evaluate(program);
}
}

0 comments on commit 7919fb0

Please sign in to comment.