X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParseFailed.java;h=d1e60aea000771313fb538496ce064bef0c6f003;hp=d46570b0457b4e9c14b2533b86008bb665d48d5f;hb=474037fe8463b96dfaf0209be157cbf5223a0910;hpb=a22c5074e705e3ffcf03e9f9d174aed8ef79fc91 diff --git a/src/edu/berkeley/sbp/ParseFailed.java b/src/edu/berkeley/sbp/ParseFailed.java index d46570b..d1e60ae 100644 --- a/src/edu/berkeley/sbp/ParseFailed.java +++ b/src/edu/berkeley/sbp/ParseFailed.java @@ -1,15 +1,80 @@ package edu.berkeley.sbp; import edu.berkeley.sbp.*; +import edu.berkeley.sbp.Sequence.Position; +import edu.berkeley.sbp.GSS.Phase; +import edu.berkeley.sbp.GSS.Phase.Node; import edu.berkeley.sbp.util.*; import java.io.*; import java.util.*; /** thrown when the parser arrives at a state from which it is clear that no valid parse can result */ -public class ParseFailed extends RuntimeException { - private final Token.Location location; +public class ParseFailed extends Exception { + + private final Input.Location location; private final String message; public ParseFailed() { this("", null); } - public ParseFailed(String message, Token.Location loc) { this.location = loc; this.message = message; } - public Token.Location getLocation() { return location; } + public ParseFailed(String message, Input.Location loc) { this.location = loc; this.message = message; } + public Input.Location getLocation() { return location; } public String toString() { return message/* + (location==null ? "" : (" at " + location))*/; } + + // FIXME + private static HashSet touched = new HashSet(); + public static void complain(GSS.Phase.Node n, HashMap> errors, boolean force) { + if (touched.contains(n)) return; + touched.add(n); + for(Position p : n.state) { + if (((p.isFirst() || p.isLast()) && !force)/* || p.owner().name==null*/) { + for(Node n2 : n.parents()) + complain(n2, errors, force | p.isFirst()); + } else { + String seqname = p.owner()/*.name*/+""; + HashSet hs = errors.get(seqname); + if (hs==null) errors.put(seqname, hs = new HashSet()); + hs.add(p.element()+""); + } + } + } + + public static String el(Object e) { + String s = e.toString(); + if (s.length()==0 || s.charAt(0)!='\"' || s.charAt(s.length()-1)!='\"') return /*ANSI.yellow(s)*/s; + s = s.substring(1); + s = s.substring(0, s.length()-1); + StringBuffer ret = new StringBuffer(); + for(int i=0; i nodes) { + String lookAhead = token==null ? "" : token.toString(); + StringBuffer ret = new StringBuffer(); + ret.append("\n "); + ret.append(message); + /* + HashMap> errors = new HashMap>(); + for(Node n : nodes) { + //System.out.println(n.state); + complain(n, errors, false); + } + for(String s : errors.keySet()) { + ret.append(" while parsing " + ANSI.yellow(s)); + HashSet hs = errors.get(s); + if (hs.size()==1) ret.append(" expected " + ANSI.yellow(el(hs.iterator().next())) + "\n"); + else { + ret.append(" expected "); + boolean first = true; + for(String s2 : hs) { + if (!first) ret.append(" or "); + first = false; + ret.append(ANSI.yellow(el(s2))); + } + ret.append("\n"); + } + } + */ + return ret.toString(); + } + }