Mercurial > projects > dil
diff trunk/src/dil/Parser.d @ 434:cac9c8d637ad
Fix: members related to error info weren't updated correctly.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sun, 07 Oct 2007 23:22:15 +0200 |
parents | 052cbacb1642 |
children | 180711cc4b66 |
line wrap: on
line diff
--- a/trunk/src/dil/Parser.d Thu Oct 04 22:31:59 2007 +0200 +++ b/trunk/src/dil/Parser.d Sun Oct 07 23:22:15 2007 +0200 @@ -96,6 +96,7 @@ auto oldToken = this.token; auto oldPrevToken = this.prevToken; auto oldCount = this.errorCount; + auto lexerState = this.lx.getState(); auto result = parseMethod(); @@ -103,6 +104,7 @@ if (errorCount != oldCount) { // Restore members. + lx.restoreState(lexerState); token = oldToken; prevToken = oldPrevToken; lx.token = oldToken; @@ -123,10 +125,23 @@ TOK peekNext() { + auto state = lx.getState(); Token* next = token; do lx.peek(next); while (next.isWhitespace) // Skip whitespace + lx.restoreState(state); + return next.type; + } + + TOK peekAfter(ref Token* next) + { + assert(next !is null); + auto state = lx.getState(); + do + lx.peek(next); + while (next.isWhitespace) // Skip whitespace + lx.restoreState(state); return next.type; } @@ -271,11 +286,9 @@ version(D2) { auto next = token; - lx.peek(next); - if (next.type == T.LParen) + if (peekAfter(next) == T.LParen) { - lx.peek(next); - if (next.type != T.RParen) + if (peekAfter(next) != T.RParen) goto case_Declaration; } else @@ -3794,6 +3807,8 @@ assert(token.type == T.LParen); Token* next = token; uint level = 1; + auto state = lx.getState(); + Loop: while (1) { lx.peek(next); @@ -3801,22 +3816,22 @@ { case T.RParen: if (--level == 0) - { // Closing parentheses found. - lx.peek(next); - break; + { // Last, closing parentheses found. + do + lx.peek(next); + while (next.isWhitespace) + break Loop; } - continue; + break; case T.LParen: ++level; - continue; + break; case T.EOF: - break; + break Loop; default: - continue; } - break; } - + lx.restoreState(state); return next.type == tok; }