X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/c4d0ba7251867ee9bdb8466357cba5a9fa352b76..05d0ced1aa6c1e685e3228e7c43aab3fbb1d88c3:/src/scan.l diff --git a/src/scan.l b/src/scan.l index 1342e5f..8a6572e 100644 --- a/src/scan.l +++ b/src/scan.l @@ -124,21 +124,27 @@ INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+ %{ char *c; - - if (yyextra > 0) { - yyextra = -yyextra; - return T_ENGLISH; - } %} -"..." 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 +164,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 +187,7 @@ INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+ #endif dup_token(); } - return ret; + return UNPACK_TOKEN(tok); } [[:space:]]+