[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