%{ #include #include %} %option noyywrap %x DQNAME %x APPNAME space [ \t\n\r\f] whitespace {space}+ dquote \" app_name_chars [\x21-\x2b\x2d-\x3b\x3d\x3f-\x5a\x5c\x5e-\x7a\x7c\x7e] app_name_indq_chars [\x20\x21\x23-\x7e] app_name {app_name_chars}+ app_name_dq ({app_name_indq_chars}|{dquote}{dquote})+ delimiter {whitespace}*,{whitespace}* app_name_start {app_name_chars} any_app \*|({dquote}\*{dquote}) xdstart {dquote} xdstop {dquote} self [\[\]\{\}<>] %% {xdstart} { BEGIN(DQNAME); } {xdstop} { BEGIN(INITIAL); } {app_name_dq} { static char name[64]; int i, j; for (i = j = 0 ; j < 63 && yytext[i] ; i++, j++) { if (yytext[i] == '"') { if (yytext[i+1] == '"') name[j] = '"'; else fprintf(stderr, "illegal quote escape"); i++; } else name[j] = yytext[i]; } name[j] = 0; yylval.str = strdup(name); return QUOTED_NAME; } {app_name_start} { BEGIN(APPNAME); yyless(0);} {app_name} { char *p; yylval.str = strdup(yytext); for (p = yylval.str ; *p ; p++) { if (*p >= 'A' && *p <= 'Z') *p = *p + ('a' - 'A'); } BEGIN(INITIAL); return NAME_OR_NUMBER; } {delimiter} { return DELIMITER;} {self} { return yytext[0];} %% //int main(void) //{ // int r; // // while(r = yylex()) { // fprintf(stderr, "#%d:(%s)#", r, yylval.str); // yylval.str = ""; // } //}