%{
#include <stdbool.h>
#include <stdint.h>
#include "iburg.h"
#include "y.tab.h"

static int braces = 0;

%}
%option warn
%option nodefault
%option noyywrap
%option yylineno
%option debug

%x QSTRING
%x COMMENT

%%

<INITIAL>"\""               BEGIN(QSTRING);
<QSTRING>"\""               BEGIN(INITIAL);

<QSTRING>[%$][a-zA-Z_][a-zA_Z_0-9]+(\.[0-9]+)? {
                                yylval.string = strdup(yytext);
                                return QFRAGMENT;
                            }

<QSTRING>[^\r\n%$"]+        {
                                yylval.string = strdup(yytext);
                                return QFRAGMENT;
                            }
<QSTRING>.                  yyerror("bad string input '%s' at line %d\n", yytext, yylineno);

<INITIAL>"/*"               BEGIN(COMMENT);
<COMMENT>"*/"               BEGIN(INITIAL);
<COMMENT>[^*]*              ;
<COMMENT>"*"                ;

"DECLARATIONS"              return DECLARATIONS;
"PATTERNS"                  return PATTERNS;
"REGISTERS"                 return REGISTERS;
"OPTIONS"                   return OPTIONS;
"aliases"                   return ALIASES;
"corrupted"                 return CORRUPTED;
"cost"                      return COST;
"emit"                      return EMIT;
"fragment"                  return FRAGMENT;
"named"                     return NAMED;
"prefers"                   return PREFERS;
"preserved"                 return PRESERVED;
"when"                      return WHEN;
"with"                      return WITH;
"=="                        return EQUALS;
"!="                        return NOTEQUALS;

"//"[^\n]*\n                ;

[A-Za-z_][A-Za-z0-9_]*      { yylval.string = strdup(yytext); return ID; }
-?[0-9]+                    { yylval.n = atoi(yytext); return INT; }
-?0x[0-9a-fA-F]+            { yylval.n = strtol(yytext, NULL, 0); return INT; }
[ \t\r\n]*                  ;
.                           return yytext[0];

%%
/* vim: set sw=4 ts=4 expandtab : */