changeset 33:cf3047cf3cd2

- Added code for parsing back quote and raw strings. - Made F lower-case in scanPostFix(). - Added more operators to be output in <op> tags.
author aziz
date Mon, 25 Jun 2007 19:04:03 +0000
parents d7011daa4740
children 41dad4aef4b1
files trunk/src/Lexer.d trunk/src/format.css trunk/src/main.d
diffstat 3 files changed, 76 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Lexer.d	Mon Jun 25 17:45:02 2007 +0000
+++ b/trunk/src/Lexer.d	Mon Jun 25 19:04:03 2007 +0000
@@ -105,8 +105,10 @@
   UnterminatedHexString,
   // /* */ /+ +/
   UnterminatedBlockComment,
-  UnterminatedNestedComment
-
+  UnterminatedNestedComment,
+  // `` r""
+  UnterminatedRawString,
+  UnterminatedBackQuoteString,
 }
 
 string[] messages = [
@@ -122,8 +124,10 @@
   "unterminated hex string.",
   // /* */ /+ +/
   "unterminated block comment (/* */).",
-  "unterminated nested comment (/+ +/)."
-
+  "unterminated nested comment (/+ +/).",
+  // `` r""
+  "unterminated raw string.",
+  "unterminated back quote string.",
 ];
 
 class Problem
@@ -215,7 +219,7 @@
 
       if (isidbeg(c))
       {
-        if (c == 'r' && p[1] == '"')
+        if (c == 'r' && p[1] == '"' && ++p)
           return scanRawStringLiteral(t);
         if (c == 'x' && p[1] == '"')
           return scanHexStringLiteral(t);
@@ -381,6 +385,9 @@
       if (c == '\'')
         return scanCharacterLiteral(t);
 
+      if (c == '`')
+        return scanRawStringLiteral(t);
+
       switch(c)
       {
       case '.':
@@ -573,7 +580,7 @@
     t.end = p;
   }
 
-  char scanPostFix()
+  char scanPostfix()
   {
     switch (*p)
     {
@@ -588,7 +595,56 @@
 
   void scanRawStringLiteral(ref Token t)
   {
-
+    uint delim = *p;
+    assert(delim == '`' || delim == '"' && p[-1] == 'r');
+    t.type = TOK.String;
+    char[] buffer;
+    uint c;
+    while (1)
+    {
+      c = *++p;
+      switch (c)
+      {
+      case '\r':
+        if (p[1] == '\n')
+          ++p;
+        c = '\n'; // Convert '\r' and '\r\n' to '\n'
+      case '\n':
+        ++loc;
+        continue;
+      case '`':
+      case '"':
+        if (c == delim)
+        {
+          ++p;
+          t.pf = scanPostfix();
+        Lreturn:
+          t.str = buffer ~ '\0';
+          t.end = p;
+          return;
+        }
+        break;
+      case LS[0]:
+        if (p[1] == LS[1] && (p[2] == LS[2] || p[2] == PS[2]))
+        {
+          // TODO: convert LS or PS to \n?
+          buffer ~= p[0..3];
+          p += 2;
+          ++loc;
+          continue;
+        }
+        break;
+      case 0, _Z_:
+        if (delim == 'r')
+          error(MID.UnterminatedRawString);
+        else
+          error(MID.UnterminatedBackQuoteString);
+        goto Lreturn;
+      default:
+      }
+      buffer ~= c; // copy character to buffer
+    }
+    assert(0);
   }
 
   void scanHexStringLiteral(ref Token t)
@@ -615,7 +671,7 @@
           error(mid);
         }
         t.str = cast(string) buffer;
-        t.pf = scanPostFix();
+        t.pf = scanPostfix();
         t.end = p;
         return;
       case '\r':
@@ -784,3 +840,4 @@
     return tokens;
   }
 }
+`fdfdfg
\ No newline at end of file
--- a/trunk/src/format.css	Mon Jun 25 17:45:02 2007 +0000
+++ b/trunk/src/format.css	Mon Jun 25 19:04:03 2007 +0000
@@ -9,5 +9,5 @@
 i { color: darkblue; }
 sl { color: red; }
 cl { color: purple; }
-op { color: orange; }
+op { color: royalblue; }
 br { color: orange; }
--- a/trunk/src/main.d	Mon Jun 25 17:45:02 2007 +0000
+++ b/trunk/src/main.d	Mon Jun 25 19:04:03 2007 +0000
@@ -52,7 +52,16 @@
       case TOK.Character:
         writef("<cl>%s</cl>", span);
       break;
-      case TOK.DivAssign:
+      case TOK.Assign, TOK.Equal,
+        TOK.OrAssign, TOK.OrBinary,
+        TOK.AndAssign, TOK.AndBinary,
+        TOK.PlusAssign, TOK.PlusPlus, TOK.Plus,
+        TOK.MinusAssign, TOK.MinusMinus, TOK.Minus,
+        TOK.DivAssign, TOK.Div,
+        TOK.MulAssign, TOK.Mul,
+        TOK.ModAssign, TOK.Mod,
+        TOK.XorAssign, TOK.Xor,
+        TOK.CatAssign, TOK.Catenate:
         writef("<op>%s</op>", span);
       break;
       case TOK.AndLogical: