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 {
+public class ParseFailed extends Exception {
+
private final Input.Location location;
private final String message;
public ParseFailed() { this("", null); }
public Input.Location getLocation() { return location; }
public String toString() { return message/* + (location==null ? "" : (" at " + location))*/; }
+ // FIXME
+ private static HashSet<GSS.Phase.Node> touched = new HashSet<GSS.Phase.Node>();
public static <Tok> void complain(GSS.Phase<Tok>.Node n, HashMap<String,HashSet<String>> errors, boolean force) {
- //if (n.touched) return;
- //n.touched = true;
+ if (touched.contains(n)) return;
+ touched.add(n);
for(Position p : n.state) {
- if (((p.isFirst() || p.isLast()) && !force) || p.owner().name==null) {
+ 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;
+ String seqname = p.owner()/*.name*/+"";
HashSet<String> hs = errors.get(seqname);
if (hs==null) errors.put(seqname, hs = new HashSet<String>());
hs.add(p.element()+"");