diff --git a/doc/manual.xml b/doc/manual.xml
index b046cb99f..227aa57dd 100644
--- a/doc/manual.xml
+++ b/doc/manual.xml
@@ -1524,7 +1524,7 @@ end;
var VARIABLE_NAME;
periods INTEGER:INTEGER, INTEGER:INTEGER;
- values EXPRESSION , EXPRESSION;
+ values DOUBLE(EXPRESSION) , DOUBLE(EXPRESSION);
@@ -1554,6 +1554,12 @@ end;
will have a constant value over the range.
+
+ Note that shock values are not restricted to numerical constants: arbitrary
+ expressions are also allowed, but you have to enclose them inside
+ parentheses.
+
+
Example
@@ -1567,6 +1573,9 @@ values 0;
var v;
periods 4:5 6 7:9;
values 1 1.1 0.9;
+var w;
+periods 1 2;
+values (1+p) (exp(z));
end;
diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy
index defb9cc97..bb88b3632 100644
--- a/preprocessor/DynareBison.yy
+++ b/preprocessor/DynareBison.yy
@@ -740,14 +740,19 @@ period_list : period_list COMMA INT_NUMBER
sigma_e : SIGMA_E EQUAL '[' triangular_matrix ']' ';' { driver.do_sigma_e(); };
-value_list
- : value_list COMMA expression
- {driver.add_value($3);}
- | value_list number
- {driver.add_value($2);}
- | expression
- {driver.add_value($1);}
- ;
+value_list : value_list COMMA '(' expression ')'
+ { driver.add_value($4); }
+ | value_list '(' expression ')'
+ { driver.add_value($3); }
+ | '(' expression ')'
+ { driver.add_value($2); }
+ | value_list COMMA signed_float
+ { driver.add_value($3); }
+ | value_list signed_float
+ { driver.add_value($2); }
+ | signed_float
+ { driver.add_value($1); }
+ ;
triangular_matrix : triangular_matrix ';' triangular_row
{ driver.end_of_row(); }
diff --git a/preprocessor/ParsingDriver.cc b/preprocessor/ParsingDriver.cc
index a719334af..e3eb96a54 100644
--- a/preprocessor/ParsingDriver.cc
+++ b/preprocessor/ParsingDriver.cc
@@ -700,9 +700,15 @@ ParsingDriver::add_value(expr_t value)
}
void
-ParsingDriver::add_value(string *p1)
+ParsingDriver::add_value(string *v)
{
- det_shocks_values.push_back(add_constant(p1));
+ expr_t id;
+ if (v->at(0) == '-')
+ id = data_tree->AddUMinus(data_tree->AddNumConstant(v->substr(1, string::npos)));
+ else
+ id = data_tree->AddNumConstant(*v);
+ delete v;
+ det_shocks_values.push_back(id);
}
void
diff --git a/preprocessor/ParsingDriver.hh b/preprocessor/ParsingDriver.hh
index 32147ee21..a84cf240c 100644
--- a/preprocessor/ParsingDriver.hh
+++ b/preprocessor/ParsingDriver.hh
@@ -283,7 +283,8 @@ public:
//! Adds a deterministic shock value
void add_value(expr_t value);
//! Adds a deterministic shock value
- void add_value(string *p1);
+ /*! \param v a string containing a (possibly negative) numeric constant */
+ void add_value(string *v);
//! Writes a Sigma_e block
void do_sigma_e();
//! Ends row of Sigma_e block