changeset 13:e5211758b63c

- Added isidbeg() function. - Modified generation of the character properties table.
author aziz
date Sat, 23 Jun 2007 12:22:03 +0000
parents 0989206cf73c
children cdf788d8bdaf
files trunk/src/Lexer.d
diffstat 1 files changed, 38 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Lexer.d	Sat Jun 23 10:02:00 2007 +0000
+++ b/trunk/src/Lexer.d	Sat Jun 23 12:22:03 2007 +0000
@@ -10,14 +10,22 @@
 
 /// ASCII character properties table.
 static const int ptable[256] = [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,23,23,23,23,23,23,23,23,22,22, 0, 0, 0, 0, 0, 0,
- 0,28,28,28,28,28,28,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24, 0, 0, 0, 0,16,
- 0,28,28,28,28,28,28,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 0, 0, 0, 0, 0, 0,
+ 0,12,12,12,12,12,12, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0,16,
+ 0,12,12,12,12,12,12, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 ];
 
 enum CProperty
@@ -26,44 +34,46 @@
        Digit = 1<<1,
          Hex = 1<<2,
        Alpha = 1<<3,
-  Identifier = 1<<4
+  Underscore = 1<<4,
 }
 
-int isoctal(char c) { return ptable[c] & CProperty.Octal; }
-int isdigit(char c) { return ptable[c] & CProperty.Digit; }
-int ishexad(char c) { return ptable[c] & CProperty.Hex; }
-int isalpha(char c) { return ptable[c] & CProperty.Alpha; }
-int isalnum(char c) { return ptable[c] & (CProperty.Alpha | CProperty.Digit); }
-int isident(char c) { return ptable[c] & CProperty.Identifier; }
-/+
+private alias CProperty CP;
+int isoctal(char c) { return ptable[c] & CP.Octal; }
+int isdigit(char c) { return ptable[c] & CP.Digit; }
+int ishexad(char c) { return ptable[c] & CP.Hex; }
+int isalpha(char c) { return ptable[c] & CP.Alpha; }
+int isalnum(char c) { return ptable[c] & (CP.Alpha | CP.Digit); }
+int isidbeg(char c) { return ptable[c] & (CP.Alpha | CP.Underscore); }
+int isident(char c) { return ptable[c] & (CP.Alpha | CP.Underscore | CP.Digit); }
+
+version(gen_ptable)
 static this()
 {
   // Initialize character properties table.
   for (int i; i < ptable.length; ++i)
   {
+    ptable[i] = 0;
     if ('0' <= i && i <= '7')
-      ptable[i] |= CProperty.Octal;
+      ptable[i] |= CP.Octal;
     if ('0' <= i && i <= '9')
-      ptable[i] |= CProperty.Digit;
+      ptable[i] |= CP.Digit;
     if (isdigit(i) || 'a' <= i && i <= 'f' || 'A' <= i && i <= 'F')
-      ptable[i] |= CProperty.Hex;
+      ptable[i] |= CP.Hex;
     if ('a' <= i && i <= 'z' || 'A' <= i && i <= 'Z')
-      ptable[i] |= CProperty.Alpha;
-    if (isalnum(i) || i == '_')
-      ptable[i] |= CProperty.Identifier;
+      ptable[i] |= CP.Alpha;
+    if (i == '_')
+      ptable[i] |= CP.Underscore;
   }
   // Print a formatted array literal.
   char[] array = "[\n";
   for (int i; i < ptable.length; ++i)
   {
-    char c = ptable[i];
-    array ~= std.string.format("%2d,", c, ((i+1) % 32) ? "":"\n");
+    int c = ptable[i];
+    array ~= std.string.format("%2d,", c, ((i+1) % 16) ? "":"\n");
   }
-  array.length = array.length - 2; // remove ",\n"
-  array ~= "\n]";
+  array[$-2..$] = "\n]";
   writefln(array);
 }
-+/
 
 const char[3] LS = \u2028;
 const char[3] PS = \u2029;
@@ -101,7 +111,7 @@
         return;
       }
 
-      if (isident(c) && !isdigit(c))
+      if (isidbeg(c))
       {
       Lidentifier:
         do