diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy index a53fa0d3b..10be9dcb1 100644 --- a/preprocessor/DynareBison.yy +++ b/preprocessor/DynareBison.yy @@ -99,14 +99,13 @@ class ParsingDriver; %token DATAFILE FILE DETERMINISTIC DOUBLING DR_CYCLE_REDUCTION_TOL DR_LOGARITHMIC_REDUCTION_TOL DR_LOGARITHMIC_REDUCTION_MAXITER DR_ALGO DROP DSAMPLE DYNASAVE DYNATYPE CALIBRATION DIFFERENTIATE_FORWARD_VARS %token END ENDVAL EQUAL ESTIMATION ESTIMATED_PARAMS ESTIMATED_PARAMS_BOUNDS ESTIMATED_PARAMS_INIT EXTENDED_PATH ENDOGENOUS_PRIOR %token FILENAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS LAST_OBS SET_TIME -%token FLOAT_NUMBER +%token FLOAT_NUMBER DATES %token DEFAULT FIXED_POINT %token FORECAST K_ORDER_SOLVER INSTRUMENTS PRIOR SHIFT MEAN STDEV VARIANCE MODE INTERVAL SHAPE DOMAINN %token GAMMA_PDF GRAPH GRAPH_FORMAT CONDITIONAL_VARIANCE_DECOMPOSITION NOCHECK STD %token HISTVAL HOMOTOPY_SETUP HOMOTOPY_MODE HOMOTOPY_STEPS HOMOTOPY_FORCE_CONTINUE HP_FILTER HP_NGRID HYBRID %token IDENTIFICATION INF_CONSTANT INITVAL INITVAL_FILE BOUNDS JSCALE INIT %token INT_NUMBER -%token DATE_NUMBER %token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF IRF_SHOCKS %token KALMAN_ALGO KALMAN_TOL SUBSAMPLES OPTIONS TOLF %token LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_IDENT_FILES LOAD_MH_FILE LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR LYAPUNOV @@ -178,8 +177,8 @@ class ParsingDriver; %type expression expression_or_empty %type equation hand_side -%type non_negative_number signed_number signed_integer -%type filename symbol vec_of_vec_value vec_value_list +%type non_negative_number signed_number signed_integer date_str +%type filename symbol vec_of_vec_value vec_value_list date_expr %type vec_value_1 vec_value signed_inf signed_number_w_inf %type range vec_value_w_inf vec_value_1_w_inf %type change_type_arg @@ -1239,7 +1238,15 @@ prior_pdf : BETA_PDF { $$ = eInvGamma2; } ; -set_time : SET_TIME '(' DATE_NUMBER ')' ';' +date_str : DATES { $$ = $1; } + +date_expr : date_str + { $$ = $1; } + | date_expr PLUS INT_NUMBER + { $$ = $1; $$->append("+").append(*$3); } + ; + +set_time : SET_TIME '(' date_expr ')' ';' { driver.set_time($3); } ; @@ -2291,10 +2298,10 @@ o_conditional_variance_decomposition : CONDITIONAL_VARIANCE_DECOMPOSITION EQUAL { driver.option_vec_int("conditional_variance_decomposition", $3); } ; o_first_obs : FIRST_OBS EQUAL INT_NUMBER { driver.option_num("first_obs", $3); }; -o_new_estimation_data_first_obs : FIRST_OBS EQUAL DATE_NUMBER +o_new_estimation_data_first_obs : FIRST_OBS EQUAL date_expr { driver.option_date("first_obs", $3); } ; -o_last_obs : LAST_OBS EQUAL DATE_NUMBER +o_last_obs : LAST_OBS EQUAL date_expr { driver.option_date("last_obs", $3); } ; o_shift : SHIFT EQUAL signed_number { driver.option_num("shift", $3); }; @@ -2338,7 +2345,7 @@ list_allowed_graph_formats : allowed_graph_formats | list_allowed_graph_formats COMMA allowed_graph_formats ; -o_subsample_name : symbol EQUAL DATE_NUMBER ':' DATE_NUMBER +o_subsample_name : symbol EQUAL date_expr ':' date_expr { driver.set_subsample_name_equal_to_date_range($1, $3, $5); } ; o_conf_sig : CONF_SIG EQUAL non_negative_number { driver.option_num("conf_sig", $3); }; diff --git a/preprocessor/DynareFlex.ll b/preprocessor/DynareFlex.ll index a5a3f6d73..24955a767 100644 --- a/preprocessor/DynareFlex.ll +++ b/preprocessor/DynareFlex.ll @@ -60,6 +60,7 @@ string eofbuff; %x VERBATIM_BLOCK %x NATIVE %x NATIVE_COMMENT +%x DATES_STATEMENT %x LINE1 %x LINE2 %x LINE3 @@ -88,13 +89,13 @@ string eofbuff; } /* spaces, tabs and carriage returns are ignored */ -[ \t\r\f]+ { yylloc->step(); } -[\n]+ { yylloc->step(); } +[ \t\r\f]+ { yylloc->step(); } +[\n]+ { yylloc->step(); } /* Comments */ -["%"].* -["/"]["/"].* -"/*" {comment_caller = YY_START; BEGIN COMMENT;} +["%"].* +["/"]["/"].* +"/*" {comment_caller = YY_START; BEGIN COMMENT;} "*/" {BEGIN comment_caller;} . @@ -201,6 +202,7 @@ string eofbuff; corr {BEGIN DYNARE_STATEMENT; return token::CORR;} /* Inside of a Dynare statement */ +dates {dates_parens_nb=0; BEGIN DATES_STATEMENT; yylval->string_val = new string("dates");} file {return token::FILE;} datafile {return token::DATAFILE;} nobs {return token::NOBS;} @@ -690,10 +692,16 @@ string eofbuff; return token::INT_NUMBER; } -dates[[:space:]]*\([[:space:]]*\'[[:space:]]*(-[1-9][0-9]*|[0-9]+)([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2]))[[:space:]]*\'[[:space:]]*\) { - yylval->string_val = new string(yytext); - return token::DATE_NUMBER; -} +\( { yylval->string_val->append(yytext); dates_parens_nb++; } +\) { + yylval->string_val->append(yytext); + if (--dates_parens_nb == 0) + { + BEGIN DYNARE_STATEMENT; + return token::DATES; + } + } +. { yylval->string_val->append(yytext); } \'[^\']+\' { yylval->string_val = new string(yytext + 1); @@ -786,7 +794,7 @@ string eofbuff; "*/"[[:space:]]*\n { BEGIN NATIVE; } . -<> { yyterminate(); } +<> { yyterminate(); } <*>. { driver.error(*yylloc, "character unrecognized by lexer"); } %% diff --git a/preprocessor/ParsingDriver.hh b/preprocessor/ParsingDriver.hh index 8b9b21e96..8ad5a9f04 100644 --- a/preprocessor/ParsingDriver.hh +++ b/preprocessor/ParsingDriver.hh @@ -71,6 +71,9 @@ public: //! Increment the location counter given a token void location_increment(Dynare::parser::location_type *yylloc, const char *yytext); + + //! Count parens in dates statement + int dates_parens_nb; }; //! Drives the scanning and parsing of the .mod file, and constructs its abstract representation