diff parser/Parser.d @ 189:75d0544ddc45

Better error handling on unexpected EOF.
author Anders Johnsen <skabet@gmail.com>
date Fri, 25 Jul 2008 13:50:01 +0200
parents 7b274cfdc1dc
children 85e492318bb6
line wrap: on
line diff
--- a/parser/Parser.d	Fri Jul 25 12:55:38 2008 +0200
+++ b/parser/Parser.d	Fri Jul 25 13:50:01 2008 +0200
@@ -112,8 +112,9 @@
 
                     default:
                         auto n1 = next();
-                        messages.report(UnexpectedTok, n1.location).arg(n1.getType);
-                        return null;
+                        isEOF(type.tok);
+                        messages.report(UnexpectedTok, n1.location).arg(n1.get(sm));
+                        return action.actOnDeclarator(type, iden, null, att);
                 }
                 messages.report(InvalidDeclType, peek.location)
                     .arg(sm.getText(peek.asRange));
@@ -128,7 +129,7 @@
                 return null;
         }
         messages.report(UnexpectedTok, peek.location)
-            .arg(peek.getType)
+            .arg(peek.get(sm))
             .arg(Tok.Identifier)
             .fatal(ExitLevel.Parser);
     }
@@ -692,7 +693,7 @@
                 if (peek.isBasicType)
                     goto case Tok.Void;
 
-                messages.report(UnexpectedBeginStmt, peek.location).arg(peek.getType);
+                messages.report(UnexpectedBeginStmt, peek.location).arg(peek.get(sm));
                 require(Tok.Seperator);
                 return null;
         }
@@ -790,7 +791,7 @@
             return Id(tok);
 
         messages.report(UnexpectedTokSingle, tok.location)
-            .arg(tok.getType)
+            .arg(tok.get(sm))
             .arg(Tok.Identifier);
     }
 
@@ -1128,10 +1129,16 @@
 
     Token require(Tok t)
     {
-        if (peek().type != t)
-            messages.report(UnexpectedTokSingle, peek.location)
-                .arg(peek.getType)
-                .arg(t);
+        if (!isa(t))
+            if(isa(Tok.EOF))
+                messages.report(UnexpectedEOF,
+                    [lexer.last.asRange][], [])
+                    .arg(lexer.last.get(sm))
+                    .fatal(ExitLevel.Parser);
+            else
+                messages.report(UnexpectedTokSingle, peek.location)
+                    .arg(peek.get(sm))
+                    .arg(typeToString[t]);
         return next();
     }
 
@@ -1148,6 +1155,16 @@
         return peek(i).type == t;
     }
 
+    bool isEOF(Token t)
+    {
+        if (isa(Tok.EOF))
+            messages.report(UnexpectedEOF, 
+                    [t.asRange][], [])
+                .arg(t.get(sm))
+                .fatal(ExitLevel.Parser);
+        return false;
+    }
+
     Token next()
     {
         return lexer.next;