diff options
Diffstat (limited to '')
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.*; | |||
| 7 | public class Checker implements ExpressionVisitor<Void, CheckerException>, StatementVisitor<Checker, CheckerException> { | 7 | public 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 @@ | |||
| 1 | package lv.enes.orang; | ||
| 2 | |||
| 3 | import lv.enes.orang.checker.Checker; | ||
| 4 | import lv.enes.orang.checker.CheckerException; | ||
| 5 | import lv.enes.orang.core.OrangRuntimeException; | ||
| 6 | import lv.enes.orang.evaluator.Evaluator; | ||
| 7 | import lv.enes.orang.evaluator.Value; | ||
| 8 | import lv.enes.orang.parser.Parser; | ||
| 9 | import lv.enes.orang.parser.ParserException; | ||
| 10 | |||
| 11 | import java.io.InputStream; | ||
| 12 | import java.io.InputStreamReader; | ||
| 13 | import java.io.Reader; | ||
| 14 | import java.io.StringReader; | ||
| 15 | import java.util.Map; | ||
| 16 | |||
| 17 | public 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 @@ | |||
| 1 | package lv.enes.orang; | 1 | package lv.enes.orang; |
| 2 | 2 | ||
| 3 | import lv.enes.orang.checker.Checker; | ||
| 4 | import lv.enes.orang.core.OrangException; | 3 | import lv.enes.orang.core.OrangException; |
| 5 | import lv.enes.orang.evaluator.Evaluator; | ||
| 6 | import lv.enes.orang.parser.Parser; | ||
| 7 | 4 | ||
| 8 | import java.io.FileReader; | 5 | import java.io.FileReader; |
| 9 | import java.io.IOException; | 6 | import 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; | |||
| 8 | import lv.enes.orang.utils.NonEmptyList; | 8 | import lv.enes.orang.utils.NonEmptyList; |
| 9 | import lv.enes.orang.utils.PeekableStream; | 9 | import lv.enes.orang.utils.PeekableStream; |
| 10 | 10 | ||
| 11 | import java.io.InputStream; | ||
| 12 | import java.io.Reader; | 11 | import java.io.Reader; |
| 13 | import java.util.ArrayList; | 12 | import java.util.ArrayList; |
| 14 | import java.util.Collections; | 13 | import java.util.Collections; |
| @@ -17,35 +16,22 @@ import java.util.List; | |||
| 17 | import java.util.function.Predicate; | 16 | import java.util.function.Predicate; |
| 18 | 17 | ||
| 19 | public class Parser { | 18 | public 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 | } |