[svn] r7496: nemerle/trunk/ncc/parsing/Lexer.n

divan svnadmin at nemerle.org
Mon Feb 26 16:27:44 CET 2007


Log:
Prevent preprocessor directive jump over end of line.

Author: divan
Date: Mon Feb 26 16:27:42 2007
New Revision: 7496

Modified:
   nemerle/trunk/ncc/parsing/Lexer.n

Modified: nemerle/trunk/ncc/parsing/Lexer.n
==============================================================================
--- nemerle/trunk/ncc/parsing/Lexer.n	(original)
+++ nemerle/trunk/ncc/parsing/Lexer.n	Mon Feb 26 16:27:42 2007
@@ -357,8 +357,25 @@
   }
 
   abstract protected read_from_input () : char;
-  abstract protected peek_or_white () : char;
-  abstract protected peek () : char;
+  abstract protected peek_or_none () : option[char];
+
+  protected peek_or_white () : char
+  {
+    match (peek_or_none ())
+    {
+      | None => ' '
+      | Some (c) => c
+    }
+  }
+
+  protected peek () : char
+  {
+    match (peek_or_none ())
+    {
+      | None => '\0'
+      | Some (c) => c
+    }
+  }
 
   public abstract Dispose () : void;
   
@@ -373,6 +390,16 @@
     if (ch == '\0') '\n' else ch
   }
 
+  protected read_not_eol () : char
+  {
+    match (peek_or_none ())
+    {
+      | None => '\n'
+      | Some ('\n') => '\n'
+      | _ => read ()
+    }
+  }
+
   protected read () : char
   {
     mutable ch = read_from_input ();
@@ -1143,16 +1170,16 @@
     def line = StringBuilder (80);
     while (c != '\n') {
       if (c == '/') {
-        c = read_or_eol ();
+        c = read_not_eol ();
         unless (c == '/')
           when (Message.ErrorCount <= 0)
             Message.Warning (1696, "Single-line comment or end-of-line expected");
         while (c != '\n') 
-          c = read_or_eol ();
+          c = read_not_eol ();
       }
       else {
         ignore (line.Append (c));
-        c = read_or_eol ();
+        c = read_not_eol ();
       }
     };
     line.ToString ()
@@ -1165,7 +1192,7 @@
     def eat_spaces () : char {
       mutable c = ' ';
       while (Char.IsWhiteSpace (c) && c != '\n') 
-        c = read_or_eol ();
+        c = read_not_eol ();
       c
     };
     def read_word () : string {
@@ -1531,22 +1558,13 @@
       
   }
     
-  override protected peek () : char
+  override protected peek_or_none () : option[char]
   {
     def inp = reader.Peek ();
     if (inp >= 0)
-      inp :> char
+      Some (inp :> char)
     else
-      '\0'
-  }
-
-  override protected peek_or_white () : char
-  {
-    def inp = reader.Peek ();
-    if (inp >= 0)
-      inp :> char
-    else
-      ' '
+      None ()
   }
   
   override protected read_from_input () : char
@@ -1666,20 +1684,12 @@
 
   public override Dispose () : void { }
   
-  override protected peek () : char
+  override protected peek_or_none () : option[char]
   {
     if (pos < reader.Length)
-      reader[pos]
+      Some (reader[pos])
     else
-      '\0'
-  }
-
-  override protected peek_or_white () : char
-  {
-    if (pos < reader.Length)
-      reader[pos]
-    else
-      ' '
+      None ()
   }
   
   override protected read_from_input () : char



More information about the svn mailing list