# HG changeset patch # User aziz # Date 1182601323 0 # Node ID e5211758b63c90c3436bcc56cee03bec564ac7b9 # Parent 0989206cf73cdef51cbac42d4473ffe08779d646 - Added isidbeg() function. - Modified generation of the character properties table. diff -r 0989206cf73c -r e5211758b63c trunk/src/Lexer.d --- 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