/* File: woof6.l This version handles special characters @#%$^& differently. These characters are returned by yylex() as their ASCII codes. Other return values are modified to be larger than 255. */ %option noyywrap %{ #include #include typedef char* YYSTYPE ; YYSTYPE yylval ; #define END 0 #define HEARD 258 #define NEWLINE 259 #define IGNORED 260 %} %% <> { sprintf(yylval, "\nWoof! are we done talking?\n"); return END; } treat { sprintf(yylval, "\n!!!%s!!! Woof! yummy!\n", yytext); return HEARD; } walk { sprintf(yylval, "\n!!!%s!!! Woof! where's the leash?\n", yytext); return HEARD; } dinner { sprintf(yylval, "\n!!!%s!!! Woof! I'm hungry!\n", yytext); return HEARD; } good\ dog { sprintf(yylval, "\n!!!%s!!! Woof! talking about me!\n", yytext); return HEARD; } [@#%$^&] { return yytext[0] ; } \n { yylval[0] = '\0' ; return NEWLINE; } . { yylval[0] = '\0' ; return IGNORED; } %% int main(int argc, char **argv) { int r ; yylval = (char *) malloc(10000) ; while ( r = yylex() ) { // print special characters as themselves if (r < 256) { printf("%c", r) ; continue ; } switch (r) { case HEARD : printf("%s", yylval) ; printf("== pat, pat, nice doggy == \n") ; break ; case NEWLINE : printf("\n") ; break ; case IGNORED : printf(".") ; break ; default : fprintf(stderr, "Oops! that wasn't supposed to happen!\n") ; } // end of switch } // end of while printf("%s", yylval) ; free(yylval) ; return 0 ; }