From 6d1c2ca82b71616f4cf30b36e86ca1c210457fe3 Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan@dynare.org>
Date: Thu, 16 Jan 2020 16:06:12 +0100
Subject: [PATCH] macro processor: allow colon-separated arrays as command-line
 defines

colon-separated command line arguments such as
```
dynare <<.mod file>> -DA=1:5 -DAA=1:2:5
```
are now translated as:
```
@#define C = [2, 3, 4, 5, 6]
@#define CC = [2, 5]
```
---
 src/macro/Driver.cc | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/macro/Driver.cc b/src/macro/Driver.cc
index 2a46d81f..be996a16 100644
--- a/src/macro/Driver.cc
+++ b/src/macro/Driver.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2019 Dynare Team
+ * Copyright © 2019-2020 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -18,6 +18,7 @@
  */
 
 #include "Driver.hh"
+#include <regex>
 
 using namespace macro;
 
@@ -40,7 +41,14 @@ Driver::parse(const string &file_arg, const string &basename_arg, istream &modfi
             if (pos == val.size())
               command_line_defines_with_endl << "@#define " << var << " = " << val << endl;
             else
-              command_line_defines_with_endl << "@#define " << var << R"( = ")" << val << R"(")" << endl;
+              {
+                // The following regex matches the range syntax: double:double(:double)?
+                regex colon_separated_doubles(R"(((((\d*\.\d+)|(\d+\.))([ed][-+]?\d+)?)|(\d+([ed][-+]?\d+)?)):((((\d*\.\d+)|(\d+\.))([ed][-+]?\d+)?)|(\d+([ed][-+]?\d+)?))(:((((\d*\.\d+)|(\d+\.))([ed][-+]?\d+)?)|(\d+([ed][-+]?\d+)?)))?)");
+                if (regex_match(val, colon_separated_doubles))
+                  command_line_defines_with_endl << "@#define " << var << " = " << val << endl;
+                else
+                  command_line_defines_with_endl << "@#define " << var << R"( = ")" << val << R"(")" << endl;
+              }
           }
         catch (const invalid_argument &)
           {
-- 
GitLab