package eu.wietsevenema.lang.oberon.tests; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import xtc.parser.ParseError; import xtc.parser.Result; import xtc.parser.SemanticValue; import xtc.tree.Node; import eu.wietsevenema.lang.oberon.exceptions.InvalidInputException; import eu.wietsevenema.lang.oberon.exceptions.ParseException; import eu.wietsevenema.lang.oberon.parser.Oberon; public class Util { public static String getAbsFilename(String relName) { return Util.class.getResource(relName).getPath(); } public static Node parseExpressionFile(String absPath) throws IOException, InvalidInputException, ParseException { return parseFile(absPath, true); } public static Node parseModuleFile(String absPath) throws IOException, InvalidInputException, ParseException { return parseFile(absPath, false); } public static Node parseModuleString(String text) throws InvalidInputException, ParseException, IOException { return parseString(text, false); } public static Node parseExpressionString(String text) throws InvalidInputException, ParseException, IOException { return parseString(text, true); } private static Node parseString(String text, boolean parseExpression) throws InvalidInputException, ParseException, IOException { Reader in = null; String absPath = ""; in = new BufferedReader(new StringReader(text)); return parse(parseExpression, in, absPath); } private static Node parseFile(String absPath, boolean parseExpression) throws IOException, InvalidInputException, ParseException { Reader in = null; in = new BufferedReader(new FileReader(new File(absPath))); return parse(parseExpression, in, absPath); } private static Node parse(boolean parseExpression, Reader in, String absPath) throws IOException, InvalidInputException, ParseException { Oberon p = new Oberon(in, absPath); Result r; if (parseExpression) { r = p.pTestExpression(0); } else { r = p.pProgram(0); } Node result; if (r.hasValue()) { SemanticValue v = (SemanticValue) r; if (v.value instanceof Node) { result = (Node) v.value; } else { throw new InvalidInputException(); } } else { ParseError err = (ParseError) r; if (-1 == err.index) { throw new ParseException(" Parse error"); } else { throw new ParseException(" " + p.location(err.index) + ": " + err.msg); } } in.close(); return result; } }