Mercurial > projects > dil
changeset 105:df34ec47fb81
- Added getState() method and State struct to Lexer.
- Implemented try_() method.
author | aziz |
---|---|
date | Sun, 08 Jul 2007 11:57:03 +0000 |
parents | b535016f8c3f |
children | 441962b0f526 |
files | trunk/src/Lexer.d trunk/src/Parser.d |
diffstat | 2 files changed, 31 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/Lexer.d Sun Jul 08 11:03:05 2007 +0000 +++ b/trunk/src/Lexer.d Sun Jul 08 11:57:03 2007 +0000 @@ -1426,6 +1426,31 @@ idtable[k.str] = k; } + struct State + { + Lexer lexer; + char* scanPointer; + size_t errorLen; + static State opCall(Lexer lexer, char* p, size_t len) + { + State s; + s.lexer = lexer; + s.scanPointer = p; + s.errorLen = len; + return s; + } + void restore() + { + lexer.p = scanPointer; + lexer.errors = lexer.errors[0..errorLen]; + } + } + + State getState() + { + return State(this, p, errors.length); + } + void peek(ref Token t) { // Because peeked tokens are not stored in a linked
--- a/trunk/src/Parser.d Sun Jul 08 11:03:05 2007 +0000 +++ b/trunk/src/Parser.d Sun Jul 08 11:57:03 2007 +0000 @@ -65,22 +65,22 @@ {} nT(); } -/* + ReturnType try_(ReturnType)(lazy ReturnType parseMethod, out failed) { auto len = errors.length; - // lx.saveCheckPoint(); + auto lexerState = lx.getState(); auto result = parseMethod(); + // If the length of the array changed we know an error occurred. if (errors.length != len) { - // lx.revertCheckPoint(); - errors = errors[0..len]; + lexerState.restore(); // Restore state of the Lexer object. + errors = errors[0..len]; // Remove errors that were added when parseMethod() was called. failed = true; } - // lx.removeCheckPoint(); return result; } -*/ + /++++++++++++++++++++++++++++++ + Declaration parsing methods + ++++++++++++++++++++++++++++++/