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]
```
parent f00d7c4b
/* /*
* Copyright © 2019 Dynare Team * Copyright © 2019-2020 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
#include "Driver.hh" #include "Driver.hh"
#include <regex>
using namespace macro; using namespace macro;
...@@ -40,7 +41,14 @@ Driver::parse(const string &file_arg, const string &basename_arg, istream &modfi ...@@ -40,7 +41,14 @@ Driver::parse(const string &file_arg, const string &basename_arg, istream &modfi
if (pos == val.size()) if (pos == val.size())
command_line_defines_with_endl << "@#define " << var << " = " << val << endl; command_line_defines_with_endl << "@#define " << var << " = " << val << endl;
else 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 &) catch (const invalid_argument &)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment