/* -*- C++ -*-
 */
%{
#include "dmem/dnew.hh"

#include <string.h> 

#include "utils/ArgList.hh"
#include "utils/ConfParser_tab.hh"
#include "utils/Symbol.hh"

static size_t s_lineNumber;

size_t ll_getLine() {
  return s_lineNumber;
}

void ll_reset() {
  s_lineNumber = 1;
}

static Symbol str_val;

%}

%x COMMENT STRING

numeric [0-9]+
exp     [eE][+-]{numeric}

fl_a    {numeric}?\.{numeric}{exp}?
fl_b    {numeric}{exp}
fl_c    {numeric}\.{exp}?

intval   [+-]?{numeric}
floatval [+-]?({fl_a}|{fl_b}|{fl_c})

symbol [a-zA-Z_][a-zA-Z_0-9]*

%%

"#".*         {}
"//".*        {}
"/*"          { BEGIN COMMENT; }

<COMMENT>([^\*]|(\*[^/]))* {}
<COMMENT>\n   { ++s_lineNumber; }
<COMMENT>"*/" { BEGIN INITIAL; }

\"                    { BEGIN STRING; 
                        str_val.clear(); 
                      }
<STRING>[^\\\"]+      { str_val += yytext; 
                      }
<STRING>\\t           { str_val += '\t'; 
                      }
<STRING>\\v           { str_val += '\v'; 
                      }
<STRING>\\n           { str_val += '\n'; 
                      }
<STRING>\\r           { str_val += '\r'; 
                      }
<STRING>\\f           { str_val += '\f'; 
                      }
<STRING>\\b           { str_val += '\b'; 
                      }
<STRING>\\[^0-9]      { str_val += yytext[1]; 
                      }
<STRING>\\[0-9]+      { char val = (char)strtol(yytext+1, (char**)NULL, 0);
                        str_val += val;
                      }
<STRING>\"            { BEGIN INITIAL;
                        yylval.str = (char *)calloc(strlen(str_val.c_str())+1, 
						    sizeof(char));
                        strcpy(yylval.str, str_val.c_str()); 
			return LString; 
                      }

[ \t\r]+  {}
\n        { ++s_lineNumber; }

{symbol}  { yylval.str = (char *)calloc(strlen(yytext)+1, 
					sizeof(char));
            strcpy(yylval.str, yytext); 
	    return LSymbol; 
          }
{intval}  { yylval.str = (char *)calloc(strlen(yytext)+1, 
					sizeof(char));
            strcpy(yylval.str, yytext); 
	    return LInteger; 
          }
{floatval} { yylval.str = (char *)calloc(strlen(yytext)+1, 
					 sizeof(char));
             strcpy(yylval.str, yytext); 
	     return LFloat; 
           }

. { return *yytext; }

%%

