From 2d07186b8b622cc21c7a78a1107921b3d75c483c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Tue, 14 Dec 2021 17:24:14 +0100 Subject: [PATCH] New model_options statement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The purpose of this statement is to specify the options that apply to the whole model, when there are several “model” blocks, so as to restore the symmetry between those blocks (since otherwise one “model” block would typically bear the options, while the other ones would typically have no option). It still remains possible to specify the options on one “model” block, or even spread accross several ones. Closes: #19 --- src/DynareBison.yy | 35 ++++++++++++++++++++--------------- src/DynareFlex.ll | 19 ++++++++++--------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/DynareBison.yy b/src/DynareBison.yy index dc1db9dc..a66cf769 100644 --- a/src/DynareBison.yy +++ b/src/DynareBison.yy @@ -183,7 +183,7 @@ class ParsingDriver; %token NO_IDENTIFICATION_STRENGTH NO_IDENTIFICATION_REDUCEDFORM NO_IDENTIFICATION_MOMENTS %token NO_IDENTIFICATION_MINIMAL NO_IDENTIFICATION_SPECTRUM NORMALIZE_JACOBIANS GRID_NBR %token TOL_RANK TOL_DERIV TOL_SV CHECKS_VIA_SUBSETS MAX_DIM_SUBSETS_GROUPS ZERO_MOMENTS_TOLERANCE -%token MAX_NROWS SQUEEZE_SHOCK_DECOMPOSITION WITH_EPILOGUE MODEL_REMOVE MODEL_REPLACE +%token MAX_NROWS SQUEEZE_SHOCK_DECOMPOSITION WITH_EPILOGUE MODEL_REMOVE MODEL_REPLACE MODEL_OPTIONS %token <vector<string>> SYMBOL_VEC @@ -344,6 +344,7 @@ statement : parameters | occbin_constraints | model_remove | model_replace + | model_options ; dsample : DSAMPLE INT_NUMBER ';' @@ -939,21 +940,23 @@ occbin_constraints_regime_option : BIND hand_side ';' { $$ = { "error_relax", $2 }; } ; -model_options : BLOCK { driver.block(); } - | o_cutoff - | o_mfs - | BYTECODE { driver.bytecode(); } - | USE_DLL { driver.use_dll(); } - | NO_STATIC { driver.no_static();} - | DIFFERENTIATE_FORWARD_VARS { driver.differentiate_forward_vars_all(); } - | DIFFERENTIATE_FORWARD_VARS EQUAL '(' symbol_list ')' { driver.differentiate_forward_vars_some(); } - | o_linear - | PARALLEL_LOCAL_FILES EQUAL '(' parallel_local_filename_list ')' - | BALANCED_GROWTH_TEST_TOL EQUAL non_negative_number { driver.balanced_growth_test_tol($3); } - ; +/* The tokens below must be accepted in both DYNARE_STATEMENT and DYNARE_BLOCK + states in the lexer, because of model block and model_options statement */ +model_option : BLOCK { driver.block(); } + | o_cutoff + | o_mfs + | BYTECODE { driver.bytecode(); } + | USE_DLL { driver.use_dll(); } + | NO_STATIC { driver.no_static();} + | DIFFERENTIATE_FORWARD_VARS { driver.differentiate_forward_vars_all(); } + | DIFFERENTIATE_FORWARD_VARS EQUAL '(' symbol_list ')' { driver.differentiate_forward_vars_some(); } + | o_linear + | PARALLEL_LOCAL_FILES EQUAL '(' parallel_local_filename_list ')' + | BALANCED_GROWTH_TEST_TOL EQUAL non_negative_number { driver.balanced_growth_test_tol($3); } + ; -model_options_list : model_options_list COMMA model_options - | model_options +model_options_list : model_options_list COMMA model_option + | model_option ; model : MODEL ';' { driver.begin_model(); } @@ -1119,6 +1122,8 @@ model_replace : MODEL_REPLACE '(' tag_pair_list_for_selection ')' ';' equation_list END ';' { driver.end_model(); }; +model_options : MODEL_OPTIONS '(' model_options_list ')' ';' + tag_pair_list_for_selection : QUOTED_STRING { $$ = { { "name", $1 } }; } | symbol EQUAL QUOTED_STRING diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll index 3150bfa6..5f21a2c5 100644 --- a/src/DynareFlex.ll +++ b/src/DynareFlex.ll @@ -193,6 +193,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]) <INITIAL>perfect_foresight_with_expectation_errors_solver {BEGIN DYNARE_STATEMENT; return token::PERFECT_FORESIGHT_WITH_EXPECTATION_ERRORS_SOLVER;} <INITIAL>compilation_setup {BEGIN DYNARE_STATEMENT; return token::COMPILATION_SETUP;} <INITIAL>model_remove {BEGIN DYNARE_STATEMENT; return token::MODEL_REMOVE;} +<INITIAL>model_options {BEGIN DYNARE_STATEMENT; return token::MODEL_OPTIONS;} <DYNARE_STATEMENT>; { if (!sigma_e) @@ -763,9 +764,9 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]) <DYNARE_BLOCK>corr {return token::CORR;} <DYNARE_BLOCK>periods {return token::PERIODS;} <DYNARE_BLOCK>scales {return token::SCALES;} -<DYNARE_BLOCK>cutoff {return token::CUTOFF;} -<DYNARE_BLOCK>mfs {return token::MFS;} -<DYNARE_BLOCK>balanced_growth_test_tol {return token::BALANCED_GROWTH_TEST_TOL;} +<DYNARE_STATEMENT,DYNARE_BLOCK>cutoff {return token::CUTOFF;} +<DYNARE_STATEMENT,DYNARE_BLOCK>mfs {return token::MFS;} +<DYNARE_STATEMENT,DYNARE_BLOCK>balanced_growth_test_tol {return token::BALANCED_GROWTH_TEST_TOL;} <DYNARE_BLOCK>gamma_pdf {return token::GAMMA_PDF;} <DYNARE_BLOCK>beta_pdf {return token::BETA_PDF;} <DYNARE_BLOCK>normal_pdf {return token::NORMAL_PDF;} @@ -881,13 +882,13 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]) <DYNARE_STATEMENT>\\ {return Dynare::parser::token_type (yytext[0]);} <DYNARE_STATEMENT>\' {return Dynare::parser::token_type (yytext[0]);} -<DYNARE_BLOCK>use_dll {return token::USE_DLL;} -<DYNARE_BLOCK>block {return token::BLOCK;} -<DYNARE_BLOCK>bytecode {return token::BYTECODE;} +<DYNARE_STATEMENT,DYNARE_BLOCK>use_dll {return token::USE_DLL;} +<DYNARE_STATEMENT,DYNARE_BLOCK>block {return token::BLOCK;} +<DYNARE_STATEMENT,DYNARE_BLOCK>bytecode {return token::BYTECODE;} <DYNARE_BLOCK>all_values_required {return token::ALL_VALUES_REQUIRED;} -<DYNARE_BLOCK>no_static {return token::NO_STATIC;} -<DYNARE_BLOCK>differentiate_forward_vars {return token::DIFFERENTIATE_FORWARD_VARS;} -<DYNARE_BLOCK>parallel_local_files {return token::PARALLEL_LOCAL_FILES;} +<DYNARE_STATEMENT,DYNARE_BLOCK>no_static {return token::NO_STATIC;} +<DYNARE_STATEMENT,DYNARE_BLOCK>differentiate_forward_vars {return token::DIFFERENTIATE_FORWARD_VARS;} +<DYNARE_STATEMENT,DYNARE_BLOCK>parallel_local_files {return token::PARALLEL_LOCAL_FILES;} <DYNARE_STATEMENT,DYNARE_BLOCK>linear {return token::LINEAR;} -- GitLab