diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2017-11-09 17:06:35 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2017-11-09 17:06:35 +0200 |
commit | 323e774380995c04ae705e29ae0e51d62246333d (patch) | |
tree | 83c18773c1efbfcdb7d3eef77d837880df21dc10 /build2/lexer.hxx | |
parent | 3b0df49b8828921edfb7b764b0628fb164dab852 (diff) |
Add support for for-loop
The semantics is similar to the C++11 range-based for:
list = 1 2 3
for i: $list
print $i
Note that there is no scoping of any kind for the loop variable ('i' in
the above example).
See tests/loop/for.test for some examples/ideas.
In the future the plan is to also support more general while-loop as well
as break and continue.
Diffstat (limited to 'build2/lexer.hxx')
-rw-r--r-- | build2/lexer.hxx | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/build2/lexer.hxx b/build2/lexer.hxx index d88d5ba..a4eda1e 100644 --- a/build2/lexer.hxx +++ b/build2/lexer.hxx @@ -66,15 +66,18 @@ namespace build2 lexer_mode (base_type v): base_type (v) {} }; - class lexer: protected butl::char_scanner + class lexer: public butl::char_scanner { public: // If escape is not NULL then only escape sequences with characters from // this string are considered "effective escapes" with all others passed // through as is. Note that the escape string is not copied. // - lexer (istream& is, const path& name, const char* escapes = nullptr) - : lexer (is, name, escapes, true) {} + lexer (istream& is, + const path& name, + uint64_t line = 1, // Start line in the stream. + const char* escapes = nullptr) + : lexer (is, name, line, escapes, true /* set_mode */) {} const path& name () const {return name_;} @@ -164,11 +167,18 @@ namespace build2 // Lexer state. // protected: - lexer (istream& is, const path& n, const char* e, bool sm) - : char_scanner (is), fail ("error", &name_), name_ (n), sep_ (false) + lexer (istream& is, + const path& name, + uint64_t line, + const char* escapes, + bool set_mode) + : char_scanner (is, true /* crlf */, line), + fail ("error", &name_), + name_ (name), + sep_ (false) { - if (sm) - mode (lexer_mode::normal, '@', e); + if (set_mode) + mode (lexer_mode::normal, '@', escapes); } const path name_; |