diff --git a/DynareBison.yy b/DynareBison.yy
index defb9cc9783d49c632d5d873fdc0f87685168407..bb88b36324611e7183cf86401f4345d03910d7fa 100644
--- a/DynareBison.yy
+++ b/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/ParsingDriver.cc b/ParsingDriver.cc
index a719334afe9814fa3f40d341196cd1aaac5a988a..e3eb96a542fec3499e64268248f53899b8e272e2 100644
--- a/ParsingDriver.cc
+++ b/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/ParsingDriver.hh b/ParsingDriver.hh
index 32147ee21a5b37ab779e94f580f7d332ea50128e..a84cf240c559922eeb7d6a6114a0b10c99cd4331 100644
--- a/ParsingDriver.hh
+++ b/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