From 67382c15f7e9176dea44c3da7f7013759c88ce33 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 21 Jan 2016 15:03:26 +0200 Subject: Add support for ==, != in eval context --- build2/lexer.cxx | 54 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 11 deletions(-) (limited to 'build2/lexer.cxx') 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) -- cgit v1.1