- public static void complain(Node n, HashMap<String,HashSet<String>> errors, boolean force) {
- if (n.touched) return;
- n.touched = true;
- 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());
+ static <Tok> void barf(HashMap<Element,Input.Location> sb, StateNode n, int indent, boolean skip, int count, Input.Location loc) {
+ if (count <= 0) {
+ barf(sb, n, indent, skip, loc);
+ } else {
+ /*
+ FIXME: removed
+ for(StateNode nn : (Iterable<StateNode>)n.parents())
+ barf(sb, nn, indent, skip, count-1, n.phase().getLocation());
+ */
+ }
+ }
+ static <Tok> void barf(HashMap<Element,Input.Location> sb, StateNode n, int indent, boolean skip, Input.Location loc) {
+ if (touched.contains(n)) return;
+ touched.add(n);
+ String s = "";
+ for(int i=0; i< indent; i++) s += " ";
+ StateNode parent = n;
+ boolean done = false;
+ boolean alldone = false;
+ boolean go = false;
+ boolean force = false;
+ for(Pos pp : (Iterable<Pos>)parent.state().positions()) {
+ Pos p = (Pos)pp;
+ if (skip) p = p.next();
+ int raise = 0;
+ done = false;
+ while(p != null) {
+ if (p.isLast()) break;
+ if (important(p)) {
+ Input.Location l = sb.get(p.element());
+ if (l == null || l.compareTo(loc) < 0)
+ sb.put(p.element(), loc);
+ done = true;
+ alldone = true;
+ }
+ /*
+ else if (p.pos-raise > 0)
+ barf(sb, n, indent, false, 1);
+ if (!new Grammar(null, null).possiblyEpsilon(p.element()))
+ break;
+ */
+ p = p.next();
+ raise++;
+ if (p.isLast()) {
+ if (!done) barf(sb, n, indent, true, 1, loc);
+ break;
+ }
+ }
+ }
+ if (!alldone) barf(sb, n, indent, false, 1, loc);
+ }
+
+
+
+ // FIXME
+ private static HashSet<StateNode> touched = new HashSet<StateNode>();
+ static <Tok> void complain(StateNode n, HashMap<String,HashSet<String>> errors, boolean force, int indent) {
+ if (touched.contains(n)) return;
+ touched.add(n);
+ for(Pos p : (Iterable<Pos>)n.state()) {
+ //if (!p.isLast() && !p.next().isLast()) continue;
+ if (((p.isFirst() || p.isLast()) && !force)/* || p.owner().name==null*/ ||
+ !important(p)) {
+ /*
+ FIXME: removed
+ for(StateNode n2 : n.parents())
+ complain(n2, errors, force
+ //| p.isFirst()
+ , indent);
+ */