%{
#include "parser.tab.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
%}

%%

"function"       { printf("TOKEN: FUNCTION\n"); return FUNCTION; }
"int"            { printf("TOKEN: INT\n"); return INT; }
"bool"           { printf("TOKEN: BOOL\n"); return BOOL; }
"true"           { printf("TOKEN: TRUE\n"); return TRUE; }
"false"          { printf("TOKEN: FALSE\n"); return FALSE; }
"if"             { printf("TOKEN: IF\n"); return IF; }
"else"           { printf("TOKEN: ELSE\n"); return ELSE; }
"while"          { printf("TOKEN: WHILE\n"); return WHILE; }
"do"             { printf("TOKEN: DO\n"); return DO; }
"for"            { printf("TOKEN: FOR\n"); return FOR; }
"print"          { printf("TOKEN: PRINT\n"); return PRINT; }
"return"         { printf("TOKEN: RETURN\n"); return RETURN; }

"=="             { printf("TOKEN: EQ\n"); return EQ; }
"&&"             { printf("TOKEN: AND\n"); return AND; }
"||"             { printf("TOKEN: OR\n"); return OR; }
"<"              { printf("TOKEN: LT\n"); return LT; }
">"              { printf("TOKEN: GT\n"); return GT; }
"="              { printf("TOKEN: ASSIGN\n"); return ASSIGN; }
"+"              { printf("TOKEN: PLUS\n"); return PLUS; }
"-"              { printf("TOKEN: MINUS\n"); return MINUS; }
"*"              { printf("TOKEN: MUL\n"); return MUL; }
"/"              { printf("TOKEN: DIV\n"); return DIV; }
"!"              { printf("TOKEN: NOT\n"); return NOT; }

"("              { printf("TOKEN: LPAREN\n"); return LPAREN; }
")"              { printf("TOKEN: RPAREN\n"); return RPAREN; }
"{"              { printf("TOKEN: LBRACE\n"); return LBRACE; }
"}"              { printf("TOKEN: RBRACE\n"); return RBRACE; }
";"              { printf("TOKEN: SEMICOLON\n"); return SEMICOLON; }

[0-9]+           { printf("TOKEN: NUM (%s)\n", yytext); yylval.num = atoi(yytext); return NUM; }
[a-zA-Z_][a-zA-Z0-9_]* { printf("TOKEN: ID (%s)\n", yytext); yylval.id = strdup(yytext); return ID; }

[ \t\r\n]+       { /* ignorar espacios */ }

.                { printf("TOKEN: ERROR (%s)\n", yytext); return ERROR; }

%%