%{ #include "parse.h" int number(void); /* see below - converts string to integer */ extern int fileno(FILE *); /* to avoid gcc warning */ %} %option always-interactive D [0-9] %% [ \t\r\n\v\f] /* skip whitespace */ [*+()] return yytext[0]; /* operators */ {D}+ return( number()); . return yytext[0]; /* bad token */ %% void (*jj_junk)(int,char *) = yyunput; /* avoids gcc warnings */ int (*jj2_junk)(void) = input; void yyerror( const char *msg) /* called for parser syntax error */ { printf( "error: %s\n", msg); } int yywrap( void) /* called at EOF */ { return 1; } int number( void) { /* Assume decimal (base 10) In general could also handle octal (0DDD...) and hex (0xDDD...) Consider using strtol(), can check for overflow. */ if( sscanf( yytext, "%d", &yylval ) != 1 ) return 0; else return INTEGER; }