summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--checker/src/main/java/lv/enes/orang/checker/Checker.java6
-rw-r--r--lexer/src/main/java/lv/enes/orang/lexer/Lexer.java8
-rw-r--r--orang/src/main/java/lv/enes/orang/CheckAndEval.java46
-rw-r--r--orang/src/main/java/lv/enes/orang/Main.java24
-rw-r--r--parser/src/main/java/lv/enes/orang/parser/Parser.java16
5 files changed, 57 insertions, 43 deletions
diff --git a/checker/src/main/java/lv/enes/orang/checker/Checker.java b/checker/src/main/java/lv/enes/orang/checker/Checker.java
index ee0914f..e15fab9 100644
--- a/checker/src/main/java/lv/enes/orang/checker/Checker.java
+++ b/checker/src/main/java/lv/enes/orang/checker/Checker.java
@@ -7,11 +7,11 @@ import java.util.*;
7public class Checker implements ExpressionVisitor<Void, CheckerException>, StatementVisitor<Checker, CheckerException> { 7public class Checker implements ExpressionVisitor<Void, CheckerException>, StatementVisitor<Checker, CheckerException> {
8 private final Set<String> definitions; 8 private final Set<String> definitions;
9 9
10 public static <E> Checker of(Map<String, E> builtins) { 10 public <E> Checker(Map<String, E> builtins) {
11 return new Checker(Collections.unmodifiableSet(builtins.keySet())); 11 this(Collections.unmodifiableSet(builtins.keySet()));
12 } 12 }
13 13
14 private Checker(Set<String> definitions) { 14 public Checker(Set<String> definitions) {
15 this.definitions = definitions; 15 this.definitions = definitions;
16 } 16 }
17 17
diff --git a/lexer/src/main/java/lv/enes/orang/lexer/Lexer.java b/lexer/src/main/java/lv/enes/orang/lexer/Lexer.java
index 50f4d22..ac336f4 100644
--- a/lexer/src/main/java/lv/enes/orang/lexer/Lexer.java
+++ b/lexer/src/main/java/lv/enes/orang/lexer/Lexer.java
@@ -33,10 +33,6 @@ public class Lexer implements Iterator<Token> {
33 33
34 private final PeekableStream<Codepoint> input; 34 private final PeekableStream<Codepoint> input;
35 35
36 public Lexer(InputStream input) {
37 this(new InputStreamReader(input));
38 }
39
40 public Lexer(Reader input) { 36 public Lexer(Reader input) {
41 var cpStream = new BufferedReader(input) 37 var cpStream = new BufferedReader(input)
42 .lines() 38 .lines()
@@ -46,10 +42,6 @@ public class Lexer implements Iterator<Token> {
46 this.input = new PeekableStream<>(Stream.concat(cpStream, theEof).iterator()); 42 this.input = new PeekableStream<>(Stream.concat(cpStream, theEof).iterator());
47 } 43 }
48 44
49 public Lexer(String input) {
50 this(new StringReader(input));
51 }
52
53 private boolean hasNext = true; 45 private boolean hasNext = true;
54 46
55 @Override 47 @Override
diff --git a/orang/src/main/java/lv/enes/orang/CheckAndEval.java b/orang/src/main/java/lv/enes/orang/CheckAndEval.java
new file mode 100644
index 0000000..92c76bd
--- /dev/null
+++ b/orang/src/main/java/lv/enes/orang/CheckAndEval.java
@@ -0,0 +1,46 @@
1package lv.enes.orang;
2
3import lv.enes.orang.checker.Checker;
4import lv.enes.orang.checker.CheckerException;
5import lv.enes.orang.core.OrangRuntimeException;
6import lv.enes.orang.evaluator.Evaluator;
7import lv.enes.orang.evaluator.Value;
8import lv.enes.orang.parser.Parser;
9import lv.enes.orang.parser.ParserException;
10
11import java.io.InputStream;
12import java.io.InputStreamReader;
13import java.io.Reader;
14import java.io.StringReader;
15import java.util.Map;
16
17public class CheckAndEval {
18 private Checker checker;
19 private Evaluator evaluator;
20
21 public CheckAndEval(Map<String, Value> builtins) {
22 this.checker = new Checker(builtins);
23 this.evaluator = new Evaluator(builtins);
24 }
25
26 public Value lastResult() {
27 return evaluator.lastResult();
28 }
29
30 public void run(InputStream is, boolean repl) throws ParserException, CheckerException, OrangRuntimeException {
31 run(new InputStreamReader(is), repl);
32 }
33
34 public void run(Reader r, boolean repl) throws OrangRuntimeException, CheckerException, ParserException {
35 var prog = repl ? Parser.parseReplProgram(r) : Parser.parseProgram(r);
36 var newChecker = checker.visit(prog);
37 var newEvaluator = evaluator.visit(prog);
38
39 checker = newChecker;
40 evaluator = newEvaluator;
41 }
42
43 public void run(String str, boolean repl) throws ParserException, CheckerException, OrangRuntimeException {
44 run(new StringReader(str), repl);
45 }
46}
diff --git a/orang/src/main/java/lv/enes/orang/Main.java b/orang/src/main/java/lv/enes/orang/Main.java
index 5730fd1..6890500 100644
--- a/orang/src/main/java/lv/enes/orang/Main.java
+++ b/orang/src/main/java/lv/enes/orang/Main.java
@@ -1,9 +1,6 @@
1package lv.enes.orang; 1package lv.enes.orang;
2 2
3import lv.enes.orang.checker.Checker;
4import lv.enes.orang.core.OrangException; 3import lv.enes.orang.core.OrangException;
5import lv.enes.orang.evaluator.Evaluator;
6import lv.enes.orang.parser.Parser;
7 4
8import java.io.FileReader; 5import java.io.FileReader;
9import java.io.IOException; 6import java.io.IOException;
@@ -19,13 +16,10 @@ public class Main {
19 } 16 }
20 17
21 private static void repl() throws IOException { 18 private static void repl() throws IOException {
22 var checker = Checker.of(Builtins.BUILTINS); 19 var pipeline = new CheckAndEval(Builtins.BUILTINS);
23 var evaluator = new Evaluator(Builtins.BUILTINS);
24 20
25 try (var stream = Main.class.getResourceAsStream("prelude.orang")) { 21 try (var stream = Main.class.getResourceAsStream("prelude.orang")) {
26 var prog = Parser.parseProgram(stream); 22 pipeline.run(stream, false);
27 checker = checker.visit(prog);
28 evaluator = evaluator.visit(prog);
29 } catch (OrangException ex) { 23 } catch (OrangException ex) {
30 STDOUT.println(STR."While evaluating prelude: \{ex}"); 24 STDOUT.println(STR."While evaluating prelude: \{ex}");
31 throw new RuntimeException(ex); 25 throw new RuntimeException(ex);
@@ -53,10 +47,8 @@ public class Main {
53 switch (line.charAt(1)) { 47 switch (line.charAt(1)) {
54 case 'l': 48 case 'l':
55 var filename = line.substring(2).trim(); 49 var filename = line.substring(2).trim();
56 try (var reader = new FileReader((filename))) { 50 try (var reader = new FileReader(filename)) {
57 var prog = Parser.parseProgram(reader); 51 pipeline.run(reader, false);
58 checker = checker.visit(prog);
59 evaluator = evaluator.visit(prog);
60 } catch (IOException | OrangException ex) { 52 } catch (IOException | OrangException ex) {
61 STDOUT.println(ex); 53 STDOUT.println(ex);
62 } 54 }
@@ -71,12 +63,10 @@ public class Main {
71 } 63 }
72 64
73 try { 65 try {
74 var prog = Parser.parseReplProgram(line); 66 pipeline.run(line, true);
75 checker = checker.visit(prog); 67 if (pipeline.lastResult() != null) {
76 evaluator = evaluator.visit(prog);
77 if (evaluator.lastResult() != null) {
78 STDOUT.print("-> "); 68 STDOUT.print("-> ");
79 STDOUT.println(evaluator.lastResult().stringify()); 69 STDOUT.println(pipeline.lastResult().stringify());
80 } 70 }
81 } catch (OrangException ex) { 71 } catch (OrangException ex) {
82 STDOUT.println(ex); 72 STDOUT.println(ex);
diff --git a/parser/src/main/java/lv/enes/orang/parser/Parser.java b/parser/src/main/java/lv/enes/orang/parser/Parser.java
index 9103123..25b57d4 100644
--- a/parser/src/main/java/lv/enes/orang/parser/Parser.java
+++ b/parser/src/main/java/lv/enes/orang/parser/Parser.java
@@ -8,7 +8,6 @@ import lv.enes.orang.lexer.Token;
8import lv.enes.orang.utils.NonEmptyList; 8import lv.enes.orang.utils.NonEmptyList;
9import lv.enes.orang.utils.PeekableStream; 9import lv.enes.orang.utils.PeekableStream;
10 10
11import java.io.InputStream;
12import java.io.Reader; 11import java.io.Reader;
13import java.util.ArrayList; 12import java.util.ArrayList;
14import java.util.Collections; 13import java.util.Collections;
@@ -17,35 +16,22 @@ import java.util.List;
17import java.util.function.Predicate; 16import java.util.function.Predicate;
18 17
19public class Parser { 18public class Parser {
20 public static Program parseProgram(InputStream in) throws ParserException {
21 var parser = new Parser(in);
22 return parser.parseProgram();
23 }
24
25 public static Program parseProgram(Reader in) throws ParserException { 19 public static Program parseProgram(Reader in) throws ParserException {
26 var parser = new Parser(in); 20 var parser = new Parser(in);
27 return parser.parseProgram(); 21 return parser.parseProgram();
28 } 22 }
29 23
30 public static Program parseReplProgram(String in) throws ParserException { 24 public static Program parseReplProgram(Reader in) throws ParserException {
31 var parser = new Parser(in); 25 var parser = new Parser(in);
32 return parser.parseReplProgram(); 26 return parser.parseReplProgram();
33 } 27 }
34 28
35 private final PeekableStream<Token> input; 29 private final PeekableStream<Token> input;
36 30
37 public Parser(InputStream in) {
38 this(new Lexer(in));
39 }
40
41 public Parser(Reader in) { 31 public Parser(Reader in) {
42 this(new Lexer(in)); 32 this(new Lexer(in));
43 } 33 }
44 34
45 public Parser(String in) {
46 this(new Lexer(in));
47 }
48
49 public Parser(Iterator<Token> input) { 35 public Parser(Iterator<Token> input) {
50 this.input = new PeekableStream<>(input); 36 this.input = new PeekableStream<>(input);
51 } 37 }