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

%%

[\t\r\n ]+  ; // Ignore whitespace

"->"        { return ARROW; }
"["         { return LBRACKET; }
"]"         { return RBRACKET; }
"{"         { return LBRACE; }
"}"         { return RBRACE; }
"("         { return LPAREN; }
")"         { return RPAREN; }
"<=>"       { return OP_EQUIV; }
"=="        { return OP_EQUAL; }
"="         { return OP_ASSIGN; }
"!="        { return OP_NEQ; }
"<"         { return OP_LT; }
">"         { return OP_GT; }
"<="        { return OP_LTE; }
">="        { return OP_GTE; }
".."        { return OP_RANGE; }
"+"         { return OP_PLUS; }
"-"         { return OP_MINUS; }
"*"         { return OP_MULTIPLY; }
"/"         { return OP_DIVIDE; }
"%"         { return OP_MODULO; }
"&&"        { return OP_AND; }
"||"        { return OP_OR; }
"=~"        { return OP_REGEX_MATCH; }
"!"         { return OP_NOT; }
"^"         { return OP_EXPONENT; }
"$."        { return DOT; }
"$"         { return DOLLAR; }
"&"         { return AMPERSAND; }
","         { return COMMA; }
"/*"        { /* Ignore multiline comments */ }
"*/"        { /* Ignore multiline comments */ }
"//"        { /* Ignore single-line comments */ }
[-+]?[0-9]+(\.[0-9]+)?([eE][-+]?[0-9]+)? { yylval = atof(yytext); return NUMBER; }
"true"      { yylval = 1; return BOOLEAN; }
"false"     { yylval = 0; return BOOLEAN; }
"undefined" { yylval = 0; return UNDEFINED; }
"undef"     { yylval = 0; return UNDEFINED; }
"\""([^\\\"]|\\(.|\n))*\"""  { yylval = strdup(yytext); return QUOTED_STRING; }
"\'"([^\\\']|\\(.|\n))*\'""    { yylval = strdup(yytext); return QUOTED_STRING; }
m?\/(\\\/|[^/])+(\/[gimsuy]*)? { yylval = strdup(yytext); return REGEX; }
[a-zA-Z_][a-zA-Z0-9_]* { yylval = strdup(yytext); return IDENTIFIER; }
. { /* Ignore unrecognized characters */ }

%%

int yywrap() {
    return 1;
}

