package com.xxiivv.mute; import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.IOException; import java.util.Scanner; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; public class MuteInterpreter { private static final String VERSION = "1.02"; ANTLRInputStream inputStream; public MuteInterpreter() { } public MuteInterpreter(ANTLRInputStream stream) { inputStream = stream; } public void startInteractiveMode() { System.out.println("\nMute Interactive Interpreter (version " + VERSION + ")"); System.out.println("==========================================="); System.out.println("Type exit to exit.\n"); Scanner scanner = new Scanner(System.in); Memory memory = new Memory(); InterpretingVisitor visitor = new InterpretingVisitor(memory); while (true) { System.out.print("> "); String line = scanner.next(); // special case // TODO : handle with a "system" module if (line.trim().equals("exit")) { System.out.println("Exiting."); break; } // so the lexer doesn't complain... line += "\n"; try { MuteLexer lexer = new MuteLexer(new ANTLRInputStream(new ByteArrayInputStream(line.getBytes("UTF-8")))); CommonTokenStream tokens = new CommonTokenStream(lexer); MuteParser parser = new MuteParser(tokens); ParseTree tree = parser.parse(); tree.accept(visitor); } catch (Exception ex) { System.err.print("INTERNAL ERROR : "); ex.printStackTrace(); } } scanner.close(); visitor.close(); } public void parse() { MuteLexer lexer = new MuteLexer(inputStream); CommonTokenStream tokens = new CommonTokenStream(lexer); MuteParser parser = new MuteParser(tokens); ParseTree tree = parser.parse(); Memory memory = new Memory(); InterpretingVisitor visitor = new InterpretingVisitor(memory); tree.accept(visitor); visitor.close(); } public static void main(String[] args) { MuteInterpreter interpreter; if (args.length == 0) { interpreter = new MuteInterpreter(); interpreter.startInteractiveMode(); } else { ANTLRInputStream input = null; try { FileInputStream fis = new FileInputStream(args[0]); input = new ANTLRInputStream(fis); fis.close(); } catch (IOException e) { throw new RuntimeException(e); } interpreter = new MuteInterpreter(input); interpreter.parse(); } } }