]> git.draconx.ca Git - cdecl99.git/blobdiff - src/scan.l
libcdecl: Fix crash when bootstrapped w/ old Bison.
[cdecl99.git] / src / scan.l
index 1342e5fd3dbbac0f095686e1bebd5ec2dea59d96..767ba2263aca0eea2fe0888ff0c2e4dd4207e767 100644 (file)
@@ -131,14 +131,25 @@ 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;
+"..."|[][;*(),] {
+       unsigned char *match;
+       static const unsigned char tab[2][8] = {
+               "*[](),.;",
+               {
+                       PACK_TOKEN(T_ASTERISK),
+                       PACK_TOKEN(T_LBRACKET),
+                       PACK_TOKEN(T_RBRACKET),
+                       PACK_TOKEN(T_LPAREN),
+                       PACK_TOKEN(T_RPAREN),
+                       PACK_TOKEN(T_COMMA),
+                       PACK_TOKEN(T_ELLIPSIS),
+                       PACK_TOKEN(T_SEMICOLON)
+               }
+       };
+
+       match = memchr(&tab, yytext[0], sizeof tab[0]);
+       return UNPACK_TOKEN(match[sizeof tab[0]]);
+}
 
 {INTEGER} {
        char *end;
@@ -158,8 +169,11 @@ INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+
 }
 
 {IDENT} {
-       int ret = cdecl__to_keyword(yytext, yyleng, yyextra);
-       if (ret == T_IDENT) {
+       unsigned x = cdecl__to_keyword(yytext, yyleng, yyextra);
+       int tok;
+
+       yylval->spectype = UNPACK_SPEC(x & 0xff);
+       if ((tok = (x >> 8)) == PACK_TOKEN(T_IDENT)) {
                /*
                 * Our IDENT pattern includes hyphens so we can match
                 * "variable-length" as a keyword.  In all other cases a
@@ -178,7 +192,7 @@ INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+
 #endif
                dup_token();
        }
-       return ret;
+       return UNPACK_TOKEN(tok);
 }
 
 [[:space:]]+