/*******************************************************************************
 * Copyright (c) 2015-2017 ONERA and IRT AESE (IRT Saint Exupéry).
 * Ce logiciel est la propriété de l’ONERA (the French Aerospace Lab) et de
 * l'IRT AESE (IRT Saint Exupéry).
 * Tous droits réservés.
 * 
 * Ce programme et les éléments qui l'accompagnent sont mis à disposition
 * aux conditions définies par le contrat de licence logiciel CeCILL-C soumise
 * au droit français et respectant les principes de diffusion des logiciels libres. 
 * Vous pouvez utiliser, modifier et/ou redistribuer ce programme 
 * sous les conditions de la licence CeCILL-C (http://www.cecill.info).

 * This software is property of ONERA (the French Aerospace Lab) and of
 * the IRT AESE (IRT Saint Exupéry).
 * All rights reserved.
 * 
 * This program and the accompanying materials are made available under
 * the terms of the CeCILL-C license under French law and
 * abiding by the rules of distribution of free software.  
 * You can  use, modify and/ or redistribute the software under the terms of 
 * the CeCILL-C license (http://www.cecill.info).
 *
 * Contributeurs/contributors:
 *     Florent Teichteil-Königsbuch (ONERA - Centre de Toulouse) - initial API and implementation
 *     Alexandre Albore (IRT Saint-Exupéry) - Altarica/Fiacre translation 
 *     
 *******************************************************************************/

%{
#include <cstdlib>
#include <cerrno>
#include <climits>
#include <string>
#include "altarica_driver.hh"
#include "altarica_parser.hh"
#undef yywrap
#define yywrap(yyscanner) 1
//#define yyterminate() 	   yy_delete_buffer(YY_CURRENT_BUFFER); return token::ALTARICA_END
#define yyterminate() return token::ALTARICA_END
%}

%option noyywrap nounput batch debug reentrant



blank [ \t]

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

%s IN_COMMENT

%%
%{
/* Location handling */
yylloc->step ();
%}

%{
typedef epoch::altarica::altarica_parser::token token;
%}

","	return token::ALTARICA_COMMA;
:	return token::ALTARICA_COLON;
;	return token::ALTARICA_SEMICOLON;
=	return token::ALTARICA_EQUAL;
"["	return token::ALTARICA_LEFTBRACKET;
"]"	return token::ALTARICA_RIGHTBRACKET;
"{"	return token::ALTARICA_LEFTEMBRACE;
"}"	return token::ALTARICA_RIGHTEMBRACE;
"const"   return token::ALTARICA_CONST;
CONST	return token::ALTARICA_CONST;
domain return token::ALTARICA_DOMAIN;
DOMAIN	return token::ALTARICA_DOMAIN;


"("    return token::ALTARICA_OPAREN;
")"    return token::ALTARICA_CPAREN;
"?"    return token::ALTARICA_IMARK;

SORT    return token::ALTARICA_SORT;
sort    return token::ALTARICA_SORT;
SIG     return token::ALTARICA_SIG;
sig     return token::ALTARICA_SIG;
"->"      return token::ALTARICA_TO;
"*"       return token::ALTARICA_STAR;
if      return token::ALTARICA_IF;
then      return token::ALTARICA_THEN;
else      return token::ALTARICA_ELSE;
case       return token::ALTARICA_CASE;
or      return token::ALTARICA_OR;
"|"     return token::ALTARICA_LOR;
and      return token::ALTARICA_AND;
"&"     return token::ALTARICA_LAND;
"!="    return token::ALTARICA_DIF;
"#"     return token::ALTARICA_CARD;
"=>"    return token::ALTARICA_IMPLIES;
"<"    return token::ALTARICA_INF;
">"    return token::ALTARICA_SUP;
"<="    return token::ALTARICA_INFEQ;
">="    return token::ALTARICA_SUPEQ;
"+"    return token::ALTARICA_PLUS;
"-"    return token::ALTARICA_MINUS;
"/"    return token::ALTARICA_DIV;
MOD    return token::ALTARICA_MOD;
mod    return token::ALTARICA_MOD;
"~"    return token::ALTARICA_TILDE;
NOT    return token::ALTARICA_NOT;
not    return token::ALTARICA_NOT;
"."    return token::ALTARICA_DOT;
MIN    return token::ALTARICA_MIN;
min    return token::ALTARICA_MIN;
MAX    return token::ALTARICA_MAX;
max    return token::ALTARICA_MAX;
TRUE    return token::ALTARICA_TRUE;
"true"    return token::ALTARICA_TRUE;
FALSE    return token::ALTARICA_FALSE;
"false"    return token::ALTARICA_FALSE;
NODE     return token::ALTARICA_NODE;
node     return token::ALTARICA_NODE;
EDON     return token::ALTARICA_EDON;
edon     return token::ALTARICA_EDON;
PARAM     return token::ALTARICA_PARAM;
param     return token::ALTARICA_PARAM;
FLOW     return token::ALTARICA_FLOW;
flow     return token::ALTARICA_FLOW;
STATE     return token::ALTARICA_STATE;
state     return token::ALTARICA_STATE;
EVENT     return token::ALTARICA_EVENT;
event     return token::ALTARICA_EVENT;
SUB      return token::ALTARICA_SUB;
sub      return token::ALTARICA_SUB;
ASSERT      return token::ALTARICA_ASSERT;
assert      return token::ALTARICA_ASSERT;
TRANS      return token::ALTARICA_TRANS;
trans      return token::ALTARICA_TRANS;
"|-"       return token::ALTARICA_TR;
":="       return token::ALTARICA_AFFECT;
SYNC       return token::ALTARICA_SYNC;
sync       return token::ALTARICA_SYNC;
INIT       return token::ALTARICA_INIT;
init       return token::ALTARICA_INIT;
PARAM_SET  return token::ALTARICA_PARAM_SET;
param_set  return token::ALTARICA_PARAM_SET;
EXTERN  return token::ALTARICA_EXTERN;
"extern"  return token::ALTARICA_EXTERN;
ccf return token::ALTARICA_CCF;
withCCF return token::ALTARICA_WITHCCF;
nodeproperty return token::ALTARICA_NODEPROPERTY;
Dirac return token::ALTARICA_LAW_DIRAC;
constant return token::ALTARICA_LAW_DISCRETE;
exponential return token::ALTARICA_LAW_EXP;
exp return token::ALTARICA_LAW_EXP;
time return token::ALTARICA_LAW_TIMED;




BOOL	return token::ALTARICA_BOOL;
bool	return token::ALTARICA_BOOL;
INTEGER	return token::ALTARICA_INTEGER;
integer	return token::ALTARICA_INTEGER;
real    return token::ALTARICA_REAL;
REAL    return token::ALTARICA_REAL;
int     return token::ALTARICA_INTEGER;
INT     return token::ALTARICA_INTEGER;
STRUCT	return token::ALTARICA_STRUCT;
"struct"	return token::ALTARICA_STRUCT;
TCURTS	return token::ALTARICA_TCURTS;
tcurts	return token::ALTARICA_TCURTS;
law     return token::ALTARICA_LAW;
remark  return token::ALTARICA_REMARK;
attribute return token::ALTARICA_ATTRIBUTE;
global return token::ALTARICA_GLOBAL;

[-+]?[0-9]*"."[0-9]+([eE][+-]?[0-9]+)?           yylval->fl = atof(yytext); return token::ALTARICA_FLOAT;
[1-9][0-9]*|0           yylval->ui = atoi(yytext) ; return token::ALTARICA_UNSIGNED_INTEGER;
[a-zA-Z_][a-zA-Z_0-9"^"]*	yylval->st = new std::string (yytext); return token::ALTARICA_IDENTIFIER; 
\".*\" return token::ALTARICA_STRING;



"//".*	{ /* ignore comments */ }
<INITIAL>{
"/*"	BEGIN(IN_COMMENT);
}
<IN_COMMENT>{
"*"+"/"			BEGIN(INITIAL);
[^*\n]*			{ /* eat comment in chunks */ }
"*"+[^*/\n]*	{ /* eat the lone star */ }
\n				yylineno++;
}



{blank}+	yylloc->step();
[\n\r]+		yylloc->lines(yyleng); yylloc->step(); yylineno += yyleng;

%%


