/*
* Copyright (C) 2003-2015 Dynare Team
*
* This file is part of Dynare.
*
* Dynare is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Dynare is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Dynare. If not, see .
*/
%{
using namespace std;
#include
#include "ParsingDriver.hh"
// Announce to Flex the prototype we want for lexing function
#define YY_DECL \
Dynare::parser::token_type \
DynareFlex::lex(Dynare::parser::semantic_type *yylval, \
Dynare::parser::location_type *yylloc, \
ParsingDriver &driver)
// Shortcut to access tokens defined by Bison
typedef Dynare::parser::token token;
/* By default yylex returns int, we use token_type.
Unfortunately yyterminate by default returns 0, which is
not of token_type. */
#define yyterminate() return Dynare::parser::token_type (0);
int comment_caller, line_caller;
/* Particular value : when sigma_e command is found
this flag is set to 1, when command finished it is set to 0
*/
int sigma_e = 0;
string eofbuff;
%}
%option c++
%option prefix="Dynare"
%option case-insensitive noyywrap nounput batch debug never-interactive
/* NB: if new start conditions are defined, add them in the line for <> */
%x COMMENT
%x DYNARE_STATEMENT
%x DYNARE_BLOCK
%x VERBATIM_BLOCK
%x NATIVE
%x NATIVE_COMMENT
%x DATES_STATEMENT
%x LINE1
%x LINE2
%x LINE3
%{
// Increments location counter for every token read
#define YY_USER_ACTION location_increment(yylloc, yytext);
%}
DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2]))
%%
/* Code put at the beginning of yylex() */
%{
// Reset location before reading token
yylloc->step();
%}
/* Rules for matching $line directives */
<*>^@#line\ \" { line_caller = YYSTATE; BEGIN(LINE1); }
[^\"]* {
filename = string(yytext);
BEGIN(LINE2);
}
\" BEGIN(LINE3);
[0-9]+ {
yylloc->begin.line = yylloc->end.line = atoi(yytext) - 1;
BEGIN(line_caller);
}
/* spaces, tabs and carriage returns are ignored */
[ \t\r\f]+ { yylloc->step(); }
[\n]+ { yylloc->step(); }
/* Comments */
["%"].*
["/"]["/"].*
"/*" {comment_caller = YY_START; BEGIN COMMENT;}
"*/" {BEGIN comment_caller;}
.
/* Begin of a Dynare statement */
var {BEGIN DYNARE_STATEMENT; return token::VAR;}
varexo {BEGIN DYNARE_STATEMENT; return token::VAREXO;}
varexo_det {BEGIN DYNARE_STATEMENT; return token::VAREXO_DET;}
trend_var {BEGIN DYNARE_STATEMENT; return token::TREND_VAR;}
log_trend_var {BEGIN DYNARE_STATEMENT; return token::LOG_TREND_VAR;}
predetermined_variables {BEGIN DYNARE_STATEMENT; return token::PREDETERMINED_VARIABLES;}
parameters {BEGIN DYNARE_STATEMENT; return token::PARAMETERS;}
periods {BEGIN DYNARE_STATEMENT; return token::PERIODS;}
model_info {BEGIN DYNARE_STATEMENT; return token::MODEL_INFO;}
estimation {BEGIN DYNARE_STATEMENT; return token::ESTIMATION;}
set_time {BEGIN DYNARE_STATEMENT; return token::SET_TIME;}
data {BEGIN DYNARE_STATEMENT; return token::DATA;}
varobs {BEGIN DYNARE_STATEMENT; return token::VAROBS;}
unit_root_vars {BEGIN DYNARE_STATEMENT; return token::UNIT_ROOT_VARS;}
rplot {BEGIN DYNARE_STATEMENT; return token::RPLOT;}
osr_params {BEGIN DYNARE_STATEMENT; return token::OSR_PARAMS;}
osr {BEGIN DYNARE_STATEMENT; return token::OSR;}
dynatype {BEGIN DYNARE_STATEMENT; return token::DYNATYPE;}
dynasave {BEGIN DYNARE_STATEMENT; return token::DYNASAVE;}
model_comparison {BEGIN DYNARE_STATEMENT; return token::MODEL_COMPARISON;}
change_type {BEGIN DYNARE_STATEMENT; return token::CHANGE_TYPE;}
load_params_and_steady_state {BEGIN DYNARE_STATEMENT; return token::LOAD_PARAMS_AND_STEADY_STATE;}
save_params_and_steady_state {BEGIN DYNARE_STATEMENT; return token::SAVE_PARAMS_AND_STEADY_STATE;}
write_latex_dynamic_model {BEGIN DYNARE_STATEMENT; return token::WRITE_LATEX_DYNAMIC_MODEL;}
write_latex_static_model {BEGIN DYNARE_STATEMENT; return token::WRITE_LATEX_STATIC_MODEL;}
write_latex_original_model {BEGIN DYNARE_STATEMENT; return token::WRITE_LATEX_ORIGINAL_MODEL;}
steady {BEGIN DYNARE_STATEMENT; return token::STEADY;}
check {BEGIN DYNARE_STATEMENT; return token::CHECK;}
simul {BEGIN DYNARE_STATEMENT; return token::SIMUL;}
stoch_simul {BEGIN DYNARE_STATEMENT; return token::STOCH_SIMUL;}
dsample {BEGIN DYNARE_STATEMENT; return token::DSAMPLE;}
Sigma_e {BEGIN DYNARE_STATEMENT; sigma_e = 1; return token::SIGMA_E;}
planner_objective {BEGIN DYNARE_STATEMENT; return token::PLANNER_OBJECTIVE;}
ramsey_model {BEGIN DYNARE_STATEMENT; return token::RAMSEY_MODEL;}
ramsey_policy {BEGIN DYNARE_STATEMENT; return token::RAMSEY_POLICY;}
discretionary_policy {BEGIN DYNARE_STATEMENT; return token::DISCRETIONARY_POLICY;}
identification {BEGIN DYNARE_STATEMENT; return token::IDENTIFICATION;}
bvar_density {BEGIN DYNARE_STATEMENT; return token::BVAR_DENSITY; }
bvar_forecast {BEGIN DYNARE_STATEMENT; return token::BVAR_FORECAST; }
dynare_sensitivity {BEGIN DYNARE_STATEMENT; return token::DYNARE_SENSITIVITY;}
initval_file {BEGIN DYNARE_STATEMENT; return token::INITVAL_FILE;}
histval_file {BEGIN DYNARE_STATEMENT; return token::HISTVAL_FILE;}
forecast {BEGIN DYNARE_STATEMENT; return token::FORECAST;}
shock_decomposition {BEGIN DYNARE_STATEMENT; return token::SHOCK_DECOMPOSITION;}
sbvar {BEGIN DYNARE_STATEMENT; return token::SBVAR;}
ms_estimation {BEGIN DYNARE_STATEMENT; return token::MS_ESTIMATION;}
ms_simulation {BEGIN DYNARE_STATEMENT; return token::MS_SIMULATION;}
ms_compute_mdd {BEGIN DYNARE_STATEMENT; return token::MS_COMPUTE_MDD;}
ms_compute_probabilities {BEGIN DYNARE_STATEMENT; return token::MS_COMPUTE_PROBABILITIES;}
ms_forecast {BEGIN DYNARE_STATEMENT; return token::MS_FORECAST;}
ms_irf {BEGIN DYNARE_STATEMENT; return token::MS_IRF;}
ms_variance_decomposition {BEGIN DYNARE_STATEMENT; return token::MS_VARIANCE_DECOMPOSITION;}
conditional_forecast {BEGIN DYNARE_STATEMENT; return token::CONDITIONAL_FORECAST;}
plot_conditional_forecast {BEGIN DYNARE_STATEMENT; return token::PLOT_CONDITIONAL_FORECAST;}
markov_switching {BEGIN DYNARE_STATEMENT; return token::MARKOV_SWITCHING;}
svar {BEGIN DYNARE_STATEMENT; return token::SVAR;}
external_function {BEGIN DYNARE_STATEMENT; return token::EXTERNAL_FUNCTION;}
/* End of a Dynare statement */
calib_smoother { BEGIN DYNARE_STATEMENT; return token::CALIB_SMOOTHER; }
model_diagnostics {BEGIN DYNARE_STATEMENT; return token::MODEL_DIAGNOSTICS;}
extended_path {BEGIN DYNARE_STATEMENT; return token::EXTENDED_PATH;}
smoother2histval {BEGIN DYNARE_STATEMENT; return token::SMOOTHER2HISTVAL;}
perfect_foresight_setup {BEGIN DYNARE_STATEMENT; return token::PERFECT_FORESIGHT_SETUP;}
perfect_foresight_solver {BEGIN DYNARE_STATEMENT; return token::PERFECT_FORESIGHT_SOLVER;}
; {
if (!sigma_e)
BEGIN INITIAL;
return Dynare::parser::token_type (yytext[0]);
}
/* Begin of a Dynare block */
model {BEGIN DYNARE_BLOCK; return token::MODEL;}
steady_state_model {BEGIN DYNARE_BLOCK; return token::STEADY_STATE_MODEL;}
initval {BEGIN DYNARE_BLOCK; return token::INITVAL;}
endval {BEGIN DYNARE_BLOCK; return token::ENDVAL;}
histval {BEGIN DYNARE_BLOCK; return token::HISTVAL;}
shocks {BEGIN DYNARE_BLOCK; return token::SHOCKS;}
mshocks {BEGIN DYNARE_BLOCK; return token::MSHOCKS;}
estimated_params {BEGIN DYNARE_BLOCK; return token::ESTIMATED_PARAMS;}
/* priors is an alias for estimated_params */
priors {BEGIN DYNARE_BLOCK;return token::ESTIMATED_PARAMS;}
estimated_params_init {BEGIN DYNARE_BLOCK; return token::ESTIMATED_PARAMS_INIT;}
estimated_params_bounds {BEGIN DYNARE_BLOCK; return token::ESTIMATED_PARAMS_BOUNDS;}
observation_trends {BEGIN DYNARE_BLOCK; return token::OBSERVATION_TRENDS;}
optim_weights {BEGIN DYNARE_BLOCK; return token::OPTIM_WEIGHTS;}
homotopy_setup {BEGIN DYNARE_BLOCK; return token::HOMOTOPY_SETUP;}
conditional_forecast_paths {BEGIN DYNARE_BLOCK; return token::CONDITIONAL_FORECAST_PATHS;}
svar_identification {BEGIN DYNARE_BLOCK; return token::SVAR_IDENTIFICATION;}
moment_calibration {BEGIN DYNARE_BLOCK; return token::MOMENT_CALIBRATION;}
irf_calibration {BEGIN DYNARE_BLOCK; return token::IRF_CALIBRATION;}
ramsey_constraints {BEGIN DYNARE_BLOCK; return token::RAMSEY_CONSTRAINTS;}
/* For the semicolon after an "end" keyword */
; {return Dynare::parser::token_type (yytext[0]);}
/* End of a Dynare block */
end {BEGIN INITIAL; return token::END;}
subsamples {return token::SUBSAMPLES;}
options {return token::OPTIONS;}
prior {
yylval->string_val = new string(yytext);
return token::PRIOR;
}
std {BEGIN DYNARE_STATEMENT; return token::STD;}
corr {BEGIN DYNARE_STATEMENT; return token::CORR;}
/* Inside of a Dynare statement */
{DATE} {
char *yycopy = strdup(yytext);
char *uput = yycopy + yyleng;
unput(')');
unput('\'');
while (uput > yycopy)
unput(*--uput);
unput('\'');
unput('(');
unput('s');
unput('e');
unput('t');
unput('a');
unput('d');
free( yycopy );
}
${DATE} { yylloc->step(); *yyout << yytext + 1; }
dates {dates_parens_nb=0; BEGIN DATES_STATEMENT; yylval->string_val = new string("dates");}
file {return token::FILE;}
datafile {return token::DATAFILE;}
dirname {return token::DIRNAME;}
nobs {return token::NOBS;}
last_obs {return token::LAST_OBS;}
first_obs {return token::FIRST_OBS;}
mean {return token::MEAN;}
stdev {return token::STDEV;}
truncate {return token::TRUNCATE;}
domain {return token::DOMAINN;}
variance {return token::VARIANCE;}
mode {return token::MODE;}
interval {return token::INTERVAL;}
shape {return token::SHAPE;}
shift {return token::SHIFT;}
bounds {return token::BOUNDS;}
init {return token::INIT;}
jscale {return token::JSCALE;}
prefilter {return token::PREFILTER;}
presample {return token::PRESAMPLE;}
lik_algo {return token::LIK_ALGO;}
lik_init {return token::LIK_INIT;}
taper_steps {return token::TAPER_STEPS;}
geweke_interval {return token::GEWEKE_INTERVAL;}
graph {return token::GRAPH;}
nograph {return token::NOGRAPH;}
nodisplay {return token::NODISPLAY;}
graph_format {return token::GRAPH_FORMAT;}
eps {yylval->string_val = new string(yytext); return token::EPS;}
pdf {yylval->string_val = new string(yytext); return token::PDF;}
fig {yylval->string_val = new string(yytext); return token::FIG;}
none {yylval->string_val = new string(yytext); return token::NONE;}
print {return token::PRINT;}
noprint {return token::NOPRINT;}
conf_sig {return token::CONF_SIG;}
mh_conf_sig {return token::MH_CONF_SIG;}
mh_replic {return token::MH_REPLIC;}
mh_drop {return token::MH_DROP;}
mh_jscale {return token::MH_JSCALE;}
mh_init_scale {return token::MH_INIT_SCALE;}
mode_file {return token::MODE_FILE;}
mode_compute {return token::MODE_COMPUTE;}
mode_check {return token::MODE_CHECK;}
mode_check_neighbourhood_size {return token::MODE_CHECK_NEIGHBOURHOOD_SIZE;}
mode_check_symmetric_plots {return token::MODE_CHECK_SYMMETRIC_PLOTS;}
mode_check_number_of_points {return token::MODE_CHECK_NUMBER_OF_POINTS;}
prior_trunc {return token::PRIOR_TRUNC;}
mh_mode {return token::MH_MODE;}
mh_nblocks {return token::MH_NBLOCKS;}
load_mh_file {return token::LOAD_MH_FILE;}
loglinear {return token::LOGLINEAR;}
linear_approximation {return token::LINEAR_APPROXIMATION;}
logdata {return token::LOGDATA;}
nodiagnostic {return token::NODIAGNOSTIC;}
kalman_algo {return token::KALMAN_ALGO;}
kalman_tol {return token::KALMAN_TOL;}
diffuse_kalman_tol {return token::DIFFUSE_KALMAN_TOL;}
forecast {return token::FORECAST;}
smoother {return token::SMOOTHER;}
bayesian_irf {return token::BAYESIAN_IRF;}
dsge_var {return token::DSGE_VAR;}
dsge_varlag {return token::DSGE_VARLAG;}
moments_varendo {return token::MOMENTS_VARENDO;}
contemporaneous_correlation {return token::CONTEMPORANEOUS_CORRELATION;}
posterior_max_subsample_draws {return token::POSTERIOR_MAX_SUBSAMPLE_DRAWS;}
filtered_vars {return token::FILTERED_VARS;}
filter_step_ahead {return token::FILTER_STEP_AHEAD;}
relative_irf {return token::RELATIVE_IRF;}
tex {return token::TEX;}
nomoments {return token::NOMOMENTS;}
std {return token::STD;}
corr {return token::CORR;}
nocorr {return token::NOCORR;}
optim {return token::OPTIM;}
periods {return token::PERIODS;}
endogenous_terminal_period {return token::ENDOGENOUS_TERMINAL_PERIOD;}
sub_draws {return token::SUB_DRAWS;}
minimal_solving_periods {return token::MINIMAL_SOLVING_PERIODS;}
markowitz {return token::MARKOWITZ;}
marginal_density {return token::MARGINAL_DENSITY;}
laplace {return token::LAPLACE;}
modifiedharmonicmean {return token::MODIFIEDHARMONICMEAN;}
constant {return token::CONSTANT;}
noconstant {return token::NOCONSTANT;}
covar {return token::COVAR;}
filename {return token::FILENAME;}
diffuse_filter {return token::DIFFUSE_FILTER;}
plot_priors {return token::PLOT_PRIORS;}
aim_solver {return token::AIM_SOLVER;}
partial_information {return token::PARTIAL_INFORMATION;}
conditional_variance_decomposition {return token::CONDITIONAL_VARIANCE_DECOMPOSITION;}
name {return token::EXT_FUNC_NAME;}
nargs {return token::EXT_FUNC_NARGS;}
first_deriv_provided {return token::FIRST_DERIV_PROVIDED;}
second_deriv_provided {return token::SECOND_DERIV_PROVIDED;}
freq {return token::FREQ;}
monthly {return token::MONTHLY; }
quarterly {return token::QUARTERLY; }
initial_year {return token::INITIAL_YEAR;}
initial_subperiod {return token::INITIAL_SUBPERIOD;}
final_year {return token::FINAL_YEAR;}
final_subperiod {return token::FINAL_SUBPERIOD;}
vlist {return token::VLIST;}
vlistlog {return token::VLISTLOG;}
vlistper {return token::VLISTPER;}
restriction_fname {return token::RESTRICTION_FNAME;}
nlags {return token::NLAGS;}
restrictions {return token::RESTRICTIONS;}
cross_restrictions {return token::CROSS_RESTRICTIONS;}
contemp_reduced_form {return token::CONTEMP_REDUCED_FORM;}
real_pseudo_forecast {return token::REAL_PSEUDO_FORECAST;}
no_bayesian_prior {return token::NO_BAYESIAN_PRIOR;}
dummy_obs {return token::DUMMY_OBS;}
spectral_density {return token::SPECTRAL_DENSITY;}
nstates {return token::NSTATES;}
indxscalesstates {return token::INDXSCALESSTATES;}
fixed_point {return token::FIXED_POINT;}
doubling {return token::DOUBLING;}
square_root_solver {return token::SQUARE_ROOT_SOLVER;}
cycle_reduction {return token::CYCLE_REDUCTION;}
logarithmic_reduction {return token::LOGARITHMIC_REDUCTION;}
use_univariate_filters_if_singularity_is_detected {return token::USE_UNIVARIATE_FILTERS_IF_SINGULARITY_IS_DETECTED;}
hybrid {return token::HYBRID;}
default {return token::DEFAULT;}
number_of_particles {return token::NUMBER_OF_PARTICLES;}
resampling {return token::RESAMPLING;}
systematic {return token::SYSTEMATIC;}
generic {return token::GENERIC;}
resampling_threshold {return token::RESAMPLING_THRESHOLD;}
resampling_method {return token::RESAMPLING_METHOD;}
kitagawa {return token::KITAGAWA;}
smooth {return token::SMOOTH;}
stratified {return token::STRATIFIED;}
filter_algorithm {return token::FILTER_ALGORITHM;}
proposal_approximation {return token::PROPOSAL_APPROXIMATION;}
cubature {return token::CUBATURE;}
unscented {return token::UNSCENTED;}
montecarlo {return token::MONTECARLO;}
distribution_approximation {return token::DISTRIBUTION_APPROXIMATION;}
proposal_distribution {return token::PROPOSAL_DISTRIBUTION;}
student_degrees_of_freedom {return token::STUDENT_DEGREES_OF_FREEDOM;}
alpha {
yylval->string_val = new string(yytext);
return token::ALPHA;
}
beta {
yylval->string_val = new string(yytext);
return token::BETA;
}
gamma {
yylval->string_val = new string(yytext);
return token::GAMMA;
}
inv_gamma {
yylval->string_val = new string(yytext);
return token::INV_GAMMA;
}
inv_gamma1 {
yylval->string_val = new string(yytext);
return token::INV_GAMMA1;
}
inv_gamma2 {
yylval->string_val = new string(yytext);
return token::INV_GAMMA2;
}
dirichlet {
yylval->string_val = new string(yytext);
return token::DIRICHLET;
}
weibull {
yylval->string_val = new string(yytext);
return token::WEIBULL;
}