package eu.wietsevenema.lang.oberon.interpreter; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileReader; import java.io.Reader; import xtc.parser.ParseError; import xtc.parser.Result; import xtc.parser.SemanticValue; import xtc.tree.Node; import eu.wietsevenema.lang.oberon.ast.declarations.Module; import eu.wietsevenema.lang.oberon.exceptions.InvalidInputException; import eu.wietsevenema.lang.oberon.parser.Oberon; public class Interpreter { public static void main(String[] args) { if ((null == args) || (0 == args.length)) { System.err.println("Usage: <file-name> <input>+"); } else { String filename = args[0]; String newLine = System.getProperty("line.separator"); String input = ""; for (int i = 1; i < args.length; i++) { input += args[i] + newLine; } ByteArrayInputStream inputStream = new ByteArrayInputStream(input.getBytes()); Reader in = null; try { in = new BufferedReader(new FileReader(filename)); Oberon p = new Oberon(in, filename, (int) new File(filename).length()); Result r = p.pProgram(0); if (r.hasValue()) { SemanticValue v = (SemanticValue) r; if (v.value instanceof Node) { Module result = (Module) v.value; Environment env = new Environment(inputStream, System.out); env.runModule(result); } else { throw new InvalidInputException(); } } else { ParseError err = (ParseError) r; if (-1 == err.index) { System.err.println(" Parse error"); } else { System.err.println(" " + p.location(err.index) + ": " + err.msg); } } } catch (Throwable x) { while (null != x.getCause()) { x = x.getCause(); } x.printStackTrace(); } finally { try { in.close(); } catch (Throwable x) { /* Ignore. */ } } } } }