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 +
   ++++++++++++++++++++++++++++++/