Showing with 30 additions and 2 deletions.
  1. +30 −2 src/lexer.d
32 changes: 30 additions & 2 deletions src/lexer.d
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ enum CMhex = 0x2;
enum CMidchar = 0x4;
enum CMzerosecond = 0x8;
enum CMdigitsecond = 0x10;
enum CMsinglechar = 0x20;

bool isoctal(char c)
{
Expand All @@ -66,6 +67,11 @@ bool isDigitSecond(char c)
return (cmtable[c] & CMdigitsecond) != 0;
}

bool issinglechar(char c)
{
return (cmtable[c] & CMsinglechar) != 0;
}

static this()
{
foreach (const c; 0 .. cmtable.length)
Expand Down Expand Up @@ -99,6 +105,21 @@ static this()
default:
break;
}

switch (c)
{
case '\\':
case '\n':
case '\r':
case 0:
case 0x1A:
case '\'':
break;
default:
if (!(c & 0x80))
cmtable[c] |= CMsinglechar;
break;
}
}
}

Expand Down Expand Up @@ -292,7 +313,14 @@ public:
return;

case '\'':
t.value = charConstant(t, 0);
if (issinglechar(p[1]) && p[2] == '\'')
{
t.uns64value = p[1]; // simple one character literal
t.value = TOKcharv;
p += 3;
}
else
t.value = charConstant(t);
return;
case 'r':
if (p[1] != '"')
Expand Down Expand Up @@ -1633,7 +1661,7 @@ public:

/**************************************
*/
final TOK charConstant(Token* t, int wide)
final TOK charConstant(Token* t)
{
uint c;
TOK tk = TOKcharv;
Expand Down