diff options
Diffstat (limited to 'src/main/com/jantuomi/tunkki')
| -rw-r--r-- | src/main/com/jantuomi/tunkki/Main.java | 68 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/Tunkki.java | 83 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/core/runtime/builtins/IncludeBuiltinFunction.java | 3 | ||||
| -rw-r--r-- | src/main/com/jantuomi/tunkki/repl/Repl.java | 52 |
4 files changed, 145 insertions, 61 deletions
diff --git a/src/main/com/jantuomi/tunkki/Main.java b/src/main/com/jantuomi/tunkki/Main.java index 5148b68..37979ab 100644 --- a/src/main/com/jantuomi/tunkki/Main.java +++ b/src/main/com/jantuomi/tunkki/Main.java @@ -8,6 +8,7 @@ import com.jantuomi.tunkki.core.runtime.Interpreter; import com.jantuomi.tunkki.core.tokenizer.Tokenizer; import com.jantuomi.tunkki.core.tokenizer.token.Token; import com.jantuomi.tunkki.exception.TunkkiError; +import com.jantuomi.tunkki.repl.Repl; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; @@ -17,75 +18,22 @@ import java.util.Scanner; public class Main { + private static Tunkki tunkki; + public static void main(String[] args) throws Exception { - boolean parseSuccess = parseArguments(args); + tunkki = new Tunkki(); + + boolean parseSuccess = tunkki.parseArguments(args); if (!parseSuccess) { return; } if (CommandLineArgumentContainer.getInstance().isInteractive()) { - repl(); + tunkki.repl(); } else { String sourceFileContents = CommandLineArgumentContainer.getInstance().getSourceFileContents(); - run(sourceFileContents); - } - } - - public static void repl() throws InterruptedException { - Scanner scanner = new Scanner(System.in); - String input; - while (true) { - System.out.print(">> "); - input = scanner.nextLine(); - - try { - run(input); - } catch (TunkkiError e) { - e.printStackTrace(); - Thread.sleep(50); - } + tunkki.run(sourceFileContents); } } - public static void run(String input) throws TunkkiError { - Tokenizer tokenizer = Tokenizer.getInstance(); - List<Token> sequence = tokenizer.tokenize(input); - - Collections.reverse(sequence); - - List<Token> trees = Parser.getInstance().parse(sequence); - if (CommandLineArgumentContainer.getInstance().isDebugModeActive()) { - Parser.getInstance().printAllTrees(trees); - } - - List<ASTNode> nodes = ASTGenerator.getInstance().generate(trees); - if (CommandLineArgumentContainer.getInstance().isDebugModeActive()) { - ASTGenerator.getInstance().printAllTrees(nodes); - } - - String output = Interpreter.execute(nodes); - - if (output.trim().length() > 0) { - System.out.println(output); - } - } - - public static boolean parseArguments(String[] args) { - CommandLineArgumentContainer container = CommandLineArgumentContainer.getInstance(); - CmdLineParser parser = new CmdLineParser(container); - - - try { - if (args.length == 0) { - throw new CmdLineException("Please provide an argument."); - } - parser.parseArgument(args); - } catch (CmdLineException e) { - System.err.println(e.getMessage()); - parser.printUsage(System.err); - return false; - } - - return true; - } } diff --git a/src/main/com/jantuomi/tunkki/Tunkki.java b/src/main/com/jantuomi/tunkki/Tunkki.java new file mode 100644 index 0000000..a4120a8 --- /dev/null +++ b/src/main/com/jantuomi/tunkki/Tunkki.java @@ -0,0 +1,83 @@ +package com.jantuomi.tunkki; + +import com.jantuomi.tunkki.core.CommandLineArgumentContainer; +import com.jantuomi.tunkki.core.parser.ASTGenerator; +import com.jantuomi.tunkki.core.parser.Parser; +import com.jantuomi.tunkki.core.parser.ast.ASTNode; +import com.jantuomi.tunkki.core.runtime.Interpreter; +import com.jantuomi.tunkki.core.tokenizer.Tokenizer; +import com.jantuomi.tunkki.core.tokenizer.token.Token; +import com.jantuomi.tunkki.exception.TunkkiError; +import com.jantuomi.tunkki.repl.Repl; +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; +import sun.awt.X11.XToolkit; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Scanner; + +public class Tunkki { + + private static Tunkki instance; + + public Tunkki() { + instance = this; + } + + public static Tunkki getInstance() { + return instance; + } + + public void repl() throws InterruptedException, IOException { + Repl repl = new Repl(this); + repl.run(); + } + + public void run(String input) throws TunkkiError { + Tokenizer tokenizer = Tokenizer.getInstance(); + List<Token> sequence = tokenizer.tokenize(input); + + Collections.reverse(sequence); + + List<Token> trees = Parser.getInstance().parse(sequence); + if (CommandLineArgumentContainer.getInstance().isDebugModeActive()) { + Parser.getInstance().printAllTrees(trees); + } + + List<ASTNode> nodes = ASTGenerator.getInstance().generate(trees); + if (CommandLineArgumentContainer.getInstance().isDebugModeActive()) { + ASTGenerator.getInstance().printAllTrees(nodes); + } + + String output = Interpreter.execute(nodes); + + if (output.trim().length() > 0) { + System.out.println(output); + } + } + + public boolean parseArguments(String[] args) { + CommandLineArgumentContainer container = CommandLineArgumentContainer.getInstance(); + CmdLineParser parser = new CmdLineParser(container); + + + try { + if (args.length == 0) { + throw new CmdLineException("Please provide an argument."); + } + parser.parseArgument(args); + } catch (CmdLineException e) { + System.err.println(e.getMessage()); + parser.printUsage(System.err); + return false; + } + + return true; + } + + public String versionString() { + return "ALPHA"; + } +} diff --git a/src/main/com/jantuomi/tunkki/core/runtime/builtins/IncludeBuiltinFunction.java b/src/main/com/jantuomi/tunkki/core/runtime/builtins/IncludeBuiltinFunction.java index e6288ed..8db1d62 100644 --- a/src/main/com/jantuomi/tunkki/core/runtime/builtins/IncludeBuiltinFunction.java +++ b/src/main/com/jantuomi/tunkki/core/runtime/builtins/IncludeBuiltinFunction.java @@ -2,6 +2,7 @@ package com.jantuomi.tunkki.core.runtime.builtins; import com.jantuomi.tunkki.Main; +import com.jantuomi.tunkki.Tunkki; import com.jantuomi.tunkki.core.CommandLineArgumentContainer; import com.jantuomi.tunkki.core.parser.datatype.Datatype; import com.jantuomi.tunkki.core.parser.datatype.StringDatatype; @@ -47,7 +48,7 @@ public class IncludeBuiltinFunction extends BuiltinFunction { return null; } - Main.run(contents); + Tunkki.getInstance().run(contents); return new VoidDatatype(); } diff --git a/src/main/com/jantuomi/tunkki/repl/Repl.java b/src/main/com/jantuomi/tunkki/repl/Repl.java new file mode 100644 index 0000000..817d746 --- /dev/null +++ b/src/main/com/jantuomi/tunkki/repl/Repl.java @@ -0,0 +1,52 @@ +package com.jantuomi.tunkki.repl; + +import com.jantuomi.tunkki.Tunkki; +import com.jantuomi.tunkki.exception.TunkkiError; +import jline.console.*; + +import java.io.IOException; +import java.io.PrintWriter; + +/** + * Created by jan on 31.7.2016. + */ +public class Repl { + + private Tunkki tunkki; + + public Repl(Tunkki tunkki) { + this.tunkki = tunkki; + } + + public void run() throws IOException, InterruptedException { + showWelcomeText(); + + ConsoleReader reader = new ConsoleReader(); + reader.setBellEnabled(false); + + String line; + PrintWriter out = new PrintWriter(System.out); + + while ((line = readLine(reader, "")) != null) { + try { + tunkki.run(line); + } + catch (TunkkiError ex) { + ex.printStackTrace(); + Thread.sleep(50); + } + + out.flush(); + } + } + + private String readLine(ConsoleReader reader, String promptMessage) + throws IOException { + String line = reader.readLine(promptMessage + "\ntunkki> "); + return line.trim(); + } + + private void showWelcomeText() { + System.out.println(String.format("tunkki REPL version %s", tunkki.versionString())); + } +} |
