/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

%{
  #include <cerrno>
  #include <climits>
  #include <cstdlib>
  #include <string>
  #include <string>
  #include <sstream>
  #include "expression-language/Driver.h"
  #include "Parser.hpp"
%}

%option noyywrap
%option nounput
%option batch
%option noinput
%option 8bit
%option c++

id         [a-zA-Z][a-zA-Z_0-9.]*
num        [-]?[0-9]+[.]?[0-9]*([eE][+-]?[0-9]+)?
whitespace [ \r\t]+

%{
  #define YY_USER_ACTION  yylloc->columns(yyleng);
%}

%%

%{
  yylloc->step();
%}

"\n" return Parser::token::TOK_NEWLINE;
"$"  return Parser::token::TOK_DOLLAR;
"{"  return Parser::token::TOK_LCURLY;
"}"  return Parser::token::TOK_RCURLY;
"("  return Parser::token::TOK_LPAREN;
")"  return Parser::token::TOK_RPAREN;
"["  return Parser::token::TOK_LSQUARE;
"]"  return Parser::token::TOK_RSQUARE;
"|"  return Parser::token::TOK_PIPE;
","  return Parser::token::TOK_COMMA;
":"  return Parser::token::TOK_COLON;
";"  return Parser::token::TOK_SEMI;
"/"  return Parser::token::TOK_FSLASH;
"\\" return Parser::token::TOK_BSLASH;
"*"  return Parser::token::TOK_STAR;
"#"  return Parser::token::TOK_HASH;
"'"  return Parser::token::TOK_SQUOTE;
"\"" return Parser::token::TOK_DQUOTE;

{whitespace} {
  yylval->build<std::string>(yytext);
  return Parser::token::TOK_WHITESPACE;
}

{num} {
  yylval->build<std::string>(yytext);
  return Parser::token::TOK_NUMBER;
}

"true" {
  yylval->build<std::string>(yytext);
  return Parser::token::TOK_TRUE;
}

"false" {
  yylval->build<std::string>(yytext);
  return Parser::token::TOK_FALSE;
}

{id} {
  yylval->build<std::string>(yytext);
  return Parser::token::TOK_IDENTIFIER;
}

. {
  yylval->build<std::string>(yytext);
  return Parser::token::TOK_MISC;
}

<<EOF>> return Parser::token::TOK_END;

%%

int yyFlexLexer::yylex() {
  throw std::logic_error("Not implemented.");
}
