
%{
static int str_or_kwd (char *yytext);
%}

%%

[0-9]+		{ yylval.num = atoi(yytext); return NUM; }
[a-z]+		{ return str_or_kwd(yytext); }
[ \t\n]		;
[(){},.]	{ return yytext[0]; }
"+"		{ yylval.op = O_PLUS; return ADDOP; }
"-"		{ yylval.op = O_MINUS; return ADDOP; }
"*"		{ yylval.op = O_TIMES; return MULOP; }
"/"		{ yylval.op = O_DIV; return MULOP; }
"="		{ return ASSIGN; }
"=="		{ yylval.op = O_EQ; return EQOP; }
"!="		{ yylval.op = O_NE; return EQOP; }
"<="		{ yylval.op = O_LE; return EQOP; }
">="		{ yylval.op = O_GE; return EQOP; }
"<"		{ yylval.op = O_LT; return EQOP; }
">"		{ yylval.op = O_GT; return EQOP; }
.		{ fprintf(stderr, "Unknown char %d\n", yytext[0]); }

%%

static struct kwd {
    char *kwd;
    int tok;
} kwd_tbl[] = {
    "if", K_IF,
    "func", K_FUNC,
    0, 0,
};
    
static int str_or_kwd (char *yytext)
{
    struct kwd *k;
    for (k = kwd_tbl; k->kwd; k++)
	if (!strcmp(k->kwd, yytext))
	    return k->tok;
    yylval.sym = CppIntern(yytext);
    return SYM;
}
