diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-01-21 15:03:26 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-01-21 15:03:26 +0200 |
commit | 67382c15f7e9176dea44c3da7f7013759c88ce33 (patch) | |
tree | 5ff4fe1436792a01d4a8576f1e0efa3ce2ff9c20 /build2/lexer.cxx | |
parent | 41f091f46b47c20dc1571db5d56a1eaade25cb1e (diff) |
Add support for ==, != in eval context
Diffstat (limited to 'build2/lexer.cxx')
-rw-r--r-- | build2/lexer.cxx | 54 |
1 files changed, 43 insertions, 11 deletions
diff --git a/build2/lexer.cxx b/build2/lexer.cxx index 65bb5e9..da3d64e 100644 --- a/build2/lexer.cxx +++ b/build2/lexer.cxx @@ -126,8 +126,8 @@ namespace build2 uint64_t ln (c.line), cn (c.column); - // This mode is quite a bit like the value mode when it comes - // to special characters. + // This mode is quite a bit like the value mode when it comes to special + // characters, except that we have some of our own. // switch (c) { @@ -143,6 +143,15 @@ namespace build2 mode_.pop (); // Expire eval mode. return token (type::rparen, sep, ln, cn); } + case '=': + case '!': + { + if (peek () == '=') + { + get (); + return token (c == '=' ? type::equal : type::not_equal, sep, ln, cn); + } + } } // Otherwise it is a name. @@ -194,31 +203,34 @@ namespace build2 if (m == lexer_mode::pairs && c == pair_separator_) break; - // The following characters are not treated as special in the - // value/pairs, eval, and quoted modes. + // The following characters are only special in the normal and + // variable name modes. // - if (m != lexer_mode::value && - m != lexer_mode::pairs && - m != lexer_mode::eval && - m != lexer_mode::quoted) + if (m == lexer_mode::normal || m == lexer_mode::variable) { switch (c) { case ':': - case '+': case '=': { done = true; break; } + case '+': + { + get (); + done = (peek () == '='); + unget (c); + break; + } } if (done) break; } - // While these extra characters are treated as the name end in - // the variable mode. + // These extra characters are treated as the name end in the variable + // mode. // if (m == lexer_mode::variable) { @@ -236,6 +248,26 @@ namespace build2 break; } + // These extra characters are treated as the name end in the eval mode. + // + if (m == lexer_mode::eval) + { + switch (c) + { + case '=': + case '!': + { + get (); + done = (peek () == '='); + unget (c); + break; + } + } + + if (done) + break; + } + // If we are quoted, these are ordinary characters. // if (m != lexer_mode::quoted) |