diff --git a/src/DynareBison.yy b/src/DynareBison.yy index dc1db9dc379fe168129a2f0f91a1c2c06b948f10..a66cf7697dc31d542e098cd5f0201cf144f3654e 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 3150bfa6aafd3d254dd937c81452bd43f15c9911..5f21a2c53958402f029546b44edd55b0e23cd708 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;}