]> git.draconx.ca Git - cdecl99.git/commitdiff
libcdecl: Combine scanner rules for punctuation.
authorNick Bowler <nbowler@draconx.ca>
Sun, 9 Jul 2023 20:51:29 +0000 (16:51 -0400)
committerNick Bowler <nbowler@draconx.ca>
Mon, 10 Jul 2023 06:01:59 +0000 (02:01 -0400)
Use a single rule to match all punctuation, with a lookup table to
return the correct token.  This gives a small size reduction for
the scanner.

src/scan.l

index 1342e5fd3dbbac0f095686e1bebd5ec2dea59d96..7e3e365af90f99102b3fc11adf198ed09e9f423d 100644 (file)
@@ -131,14 +131,31 @@ INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+
        }
 %}
 
-"..." return T_ELLIPSIS;
-";"   return T_SEMICOLON;
-"*"   return T_ASTERISK;
-"("   return T_LPAREN;
-")"   return T_RPAREN;
-"["   return T_LBRACKET;
-"]"   return T_RBRACKET;
-","   return T_COMMA;
+"..."|[][;*(),] {
+       static const unsigned char tab[2][8] = {
+               "*[](),.;",
+               {
+                       T_ASTERISK  & 0xff,
+                       T_LBRACKET  & 0xff,
+                       T_RBRACKET  & 0xff,
+                       T_LPAREN    & 0xff,
+                       T_RPAREN    & 0xff,
+                       T_COMMA     & 0xff,
+                       T_ELLIPSIS  & 0xff,
+                       T_SEMICOLON & 0xff
+               }
+       };
+
+       unsigned char *match;
+       int x;
+
+       match = memchr(&tab, yytext[0], sizeof tab[0]);
+       x = match[sizeof tab[0]];
+
+       if (T_VOID >= 256)
+               x += 256;
+       return x;
+}
 
 {INTEGER} {
        char *end;