Mercurial > projects > dang
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;