better reporting of indentation related parse errors
[sbp.git] / src / edu / berkeley / sbp / GSS.java
index ca8e1d5..5c1b92f 100644 (file)
@@ -107,7 +107,8 @@ class GSS {
         public boolean isDone() throws ParseFailed {
             if (token != null) return false;
             if (token==null && finalResult==null)
-                ParseFailed.error("unexpected end of file", this);
+                ParseFailed.error("unexpected end of file", this, null,
+                                  getLocation().createRegion(getLocation()));
             return true;
         }
 
@@ -140,8 +141,23 @@ class GSS {
             }
             numNewNodes = next==null ? 0 : next.hash.size();
             viewPos = this.pos;
-            if (!good && token!=null) ParseFailed.error("unexpected character", this);
-            if (token==null && finalResult==null) ParseFailed.error("unexpected end of file", this);
+            if (!good && token!=null) {
+                String toks = token+"";
+                if (toks.length()==1 && toks.charAt(0) == edu.berkeley.sbp.chr.CharAtom.left) {
+                    ParseFailed.error("unexpected increase in indentation", this,
+                                      token, getRegionFromThisToNext());
+                } else if (toks.length()==1 && toks.charAt(0) == edu.berkeley.sbp.chr.CharAtom.right) {
+                    ParseFailed.error("unexpected decrease in indentation", this,
+                                      token, getRegionFromThisToNext());
+                } else {
+                    ParseFailed.error("unexpected character '"+ANSI.cyan(StringUtil.escapify(token+"",
+                                                                                             "\\\'\r\n"))+"'",
+                                      this, token, getRegionFromThisToNext());
+                }
+            }
+            if (token==null && finalResult==null)
+                ParseFailed.error("unexpected end of file", this, null,
+                                  getLocation().createRegion(getLocation()));
             for(Node n : hash) n.check();
         }