From c759b1e350b9afb8d6fbdc1663cdced3ca308bcc Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Thu, 22 Aug 2024 23:12:19 +0800 Subject: Made a single CheckAndEval class to make main repl loop look less ugly --- .../main/java/lv/enes/orang/checker/Checker.java | 6 +-- lexer/src/main/java/lv/enes/orang/lexer/Lexer.java | 8 ---- .../src/main/java/lv/enes/orang/CheckAndEval.java | 46 ++++++++++++++++++++++ orang/src/main/java/lv/enes/orang/Main.java | 24 ++++------- .../src/main/java/lv/enes/orang/parser/Parser.java | 16 +------- 5 files changed, 57 insertions(+), 43 deletions(-) create mode 100644 orang/src/main/java/lv/enes/orang/CheckAndEval.java 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.*; public class Checker implements ExpressionVisitor, StatementVisitor { private final Set definitions; - public static Checker of(Map builtins) { - return new Checker(Collections.unmodifiableSet(builtins.keySet())); + public Checker(Map builtins) { + this(Collections.unmodifiableSet(builtins.keySet())); } - private Checker(Set definitions) { + public Checker(Set definitions) { this.definitions = definitions; } 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 { private final PeekableStream input; - public Lexer(InputStream input) { - this(new InputStreamReader(input)); - } - public Lexer(Reader input) { var cpStream = new BufferedReader(input) .lines() @@ -46,10 +42,6 @@ public class Lexer implements Iterator { this.input = new PeekableStream<>(Stream.concat(cpStream, theEof).iterator()); } - public Lexer(String input) { - this(new StringReader(input)); - } - private boolean hasNext = true; @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 @@ +package lv.enes.orang; + +import lv.enes.orang.checker.Checker; +import lv.enes.orang.checker.CheckerException; +import lv.enes.orang.core.OrangRuntimeException; +import lv.enes.orang.evaluator.Evaluator; +import lv.enes.orang.evaluator.Value; +import lv.enes.orang.parser.Parser; +import lv.enes.orang.parser.ParserException; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Map; + +public class CheckAndEval { + private Checker checker; + private Evaluator evaluator; + + public CheckAndEval(Map builtins) { + this.checker = new Checker(builtins); + this.evaluator = new Evaluator(builtins); + } + + public Value lastResult() { + return evaluator.lastResult(); + } + + public void run(InputStream is, boolean repl) throws ParserException, CheckerException, OrangRuntimeException { + run(new InputStreamReader(is), repl); + } + + public void run(Reader r, boolean repl) throws OrangRuntimeException, CheckerException, ParserException { + var prog = repl ? Parser.parseReplProgram(r) : Parser.parseProgram(r); + var newChecker = checker.visit(prog); + var newEvaluator = evaluator.visit(prog); + + checker = newChecker; + evaluator = newEvaluator; + } + + public void run(String str, boolean repl) throws ParserException, CheckerException, OrangRuntimeException { + run(new StringReader(str), repl); + } +} 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 @@ package lv.enes.orang; -import lv.enes.orang.checker.Checker; import lv.enes.orang.core.OrangException; -import lv.enes.orang.evaluator.Evaluator; -import lv.enes.orang.parser.Parser; import java.io.FileReader; import java.io.IOException; @@ -19,13 +16,10 @@ public class Main { } private static void repl() throws IOException { - var checker = Checker.of(Builtins.BUILTINS); - var evaluator = new Evaluator(Builtins.BUILTINS); + var pipeline = new CheckAndEval(Builtins.BUILTINS); try (var stream = Main.class.getResourceAsStream("prelude.orang")) { - var prog = Parser.parseProgram(stream); - checker = checker.visit(prog); - evaluator = evaluator.visit(prog); + pipeline.run(stream, false); } catch (OrangException ex) { STDOUT.println(STR."While evaluating prelude: \{ex}"); throw new RuntimeException(ex); @@ -53,10 +47,8 @@ public class Main { switch (line.charAt(1)) { case 'l': var filename = line.substring(2).trim(); - try (var reader = new FileReader((filename))) { - var prog = Parser.parseProgram(reader); - checker = checker.visit(prog); - evaluator = evaluator.visit(prog); + try (var reader = new FileReader(filename)) { + pipeline.run(reader, false); } catch (IOException | OrangException ex) { STDOUT.println(ex); } @@ -71,12 +63,10 @@ public class Main { } try { - var prog = Parser.parseReplProgram(line); - checker = checker.visit(prog); - evaluator = evaluator.visit(prog); - if (evaluator.lastResult() != null) { + pipeline.run(line, true); + if (pipeline.lastResult() != null) { STDOUT.print("-> "); - STDOUT.println(evaluator.lastResult().stringify()); + STDOUT.println(pipeline.lastResult().stringify()); } } catch (OrangException ex) { 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; import lv.enes.orang.utils.NonEmptyList; import lv.enes.orang.utils.PeekableStream; -import java.io.InputStream; import java.io.Reader; import java.util.ArrayList; import java.util.Collections; @@ -17,35 +16,22 @@ import java.util.List; import java.util.function.Predicate; public class Parser { - public static Program parseProgram(InputStream in) throws ParserException { - var parser = new Parser(in); - return parser.parseProgram(); - } - public static Program parseProgram(Reader in) throws ParserException { var parser = new Parser(in); return parser.parseProgram(); } - public static Program parseReplProgram(String in) throws ParserException { + public static Program parseReplProgram(Reader in) throws ParserException { var parser = new Parser(in); return parser.parseReplProgram(); } private final PeekableStream input; - public Parser(InputStream in) { - this(new Lexer(in)); - } - public Parser(Reader in) { this(new Lexer(in)); } - public Parser(String in) { - this(new Lexer(in)); - } - public Parser(Iterator input) { this.input = new PeekableStream<>(input); } -- cgit v1.2.3