-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
147 additions
and
0 deletions.
There are no files selected for viewing
32 changes: 32 additions & 0 deletions
32
src/main/java/dk/madsravn/interpreter/evaluator/Evaluator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
14
src/main/java/dk/madsravn/interpreter/object/BooleanObject.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
25
src/main/java/dk/madsravn/interpreter/object/IntegerObject.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
14
src/main/java/dk/madsravn/interpreter/object/NullObject.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
55
src/test/java/dk/madsravn/interpreter/evaluator/EvaluatorTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |