%{
#include "y.tab.h"
#include "string.h"
#undef yywrap
int yywrap(void) { return(1); }
extern char *mystrdup(char *);
%}

%%

#.*\n				;
^:.*\n				;
[ \t\r\n]			;
[-+*/%.!?:()\[\]]		{ return(*yytext); }

january				{ yylval.ival =   1; return(MONTH); }
february			{ yylval.ival =   2; return(MONTH); }
march				{ yylval.ival =   3; return(MONTH); }
april				{ yylval.ival =   4; return(MONTH); }
may				{ yylval.ival =   5; return(MONTH); }
june				{ yylval.ival =   6; return(MONTH); }
july				{ yylval.ival =   7; return(MONTH); }
august				{ yylval.ival =   8; return(MONTH); }
september			{ yylval.ival =   9; return(MONTH); }
october				{ yylval.ival =  10; return(MONTH); }
november			{ yylval.ival =  11; return(MONTH); }
december			{ yylval.ival =  12; return(MONTH); }

monday				{ yylval.ival =   1; return(WDAY); }
tuesday				{ yylval.ival =   2; return(WDAY); }
wednesday			{ yylval.ival =   3; return(WDAY); }
thursday			{ yylval.ival =   4; return(WDAY); }
friday				{ yylval.ival =   5; return(WDAY); }
saturday			{ yylval.ival =   6; return(WDAY); }
sunday				{ yylval.ival =   7; return(WDAY); }
workday				{ yylval.ival =   -1; return(WDAY); }

1st|first			{ yylval.ival =   1; return(NUMBER); }
2nd|second			{ yylval.ival =   2; return(NUMBER); }
3rd|third			{ yylval.ival =   3; return(NUMBER); }
4th|fourth			{ yylval.ival =   4; return(NUMBER); }
5th|fifth			{ yylval.ival =   5; return(NUMBER); }
last				{ yylval.ival = 999; return(NUMBER); }
any				{ yylval.ival =   0; return(NUMBER); }

before				{ yylval.ival =  -1; return(NUMBER); }
after				{ yylval.ival =  -2; return(NUMBER); }

[0-9]+				{ yylval.ival = atoi(yytext); return(NUMBER); }

\"[^"]*\"			{ yylval.sval = mystrdup(yytext+1);
				  yylval.sval[strlen(yylval.sval)-1] = 0;
				  return(STRING); }

every				;
day				;
days				;
on				;
in				{ return(IN);    }
plus				{ return(PLUS);  }
minus				{ return(MINUS); }
small				{ return(SMALL); }
year				{ return(CYEAR);  }
leapyear			{ return(LEAPYEAR); }
easter				{ return(EASTER); }
pascha				{ return(PASCHA); }
length				{ return(LENGTH); }
reset				{ return(RESET);  }

black				{ yylval.ival = 1; return(COLOR); }
red				{ yylval.ival = 2; return(COLOR); }
green				{ yylval.ival = 3; return(COLOR); }
yellow				{ yylval.ival = 4; return(COLOR); }
blue				{ yylval.ival = 5; return(COLOR); }
magenta				{ yylval.ival = 6; return(COLOR); }
cyan				{ yylval.ival = 7; return(COLOR); }
white				{ yylval.ival = 8; return(COLOR); }
weekend				{ yylval.ival = 9; return(COLOR); }

"=="				{ return(EQ_); }
"!="				{ return(NE); }
"<="				{ return(LE); }
">="				{ return(GE); }
"<"				{ return(LT); }
">"				{ return(GT); }
"&&"				{ return(AND);}
"||"				{ return(OR); }

.				{ printf("holiday: bad char: %s \n", yytext); }

%%
