package org.reldb.rel.v0.interpreter; import org.reldb.rel.utilities.StringUtils; import org.reldb.rel.v0.languages.tutoriald.parser.ParseException; import org.reldb.rel.v0.languages.tutoriald.parser.Token; public class ParseExceptionPrinter { public static String getParseExceptionMessage(ParseException pe) { StringBuffer expected = new StringBuffer(); int maxSize = 0; int[][] expectedTokenSequences = pe.expectedTokenSequences; String eol = System.getProperty("line.separator", "\n"); String[] tokenImage = pe.tokenImage; Token currentToken = pe.currentToken; for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { maxSize = expectedTokenSequences[i].length; } for (int j = 0; j < expectedTokenSequences[i].length; j++) { expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' '); } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected.append("..."); } expected.append(eol).append(" "); } String retval = "Encountered "; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { if (i != 0) retval += " "; if (tok.kind == 0) { retval += tokenImage[0]; break; } retval += "\""; retval += StringUtils.quote(tok.image); retval += "\""; tok = tok.next; } retval += " at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; retval += "." + eol; if (expectedTokenSequences.length == 1) { retval += "Was expecting:" + eol + " "; } else { retval += "Was expecting one of:" + eol + " "; } retval += expected.toString(); return retval; } }