diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-12-05 15:09:04 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-12-05 15:09:04 +0200 |
commit | 54870fb76b5f59cc2e6d69a8c7a8ef17853a0029 (patch) | |
tree | 770b01aa56348ec75f17fb834a2a7123ba9c3f73 /build2/lexer.cxx | |
parent | ef7cb7ea3e6fcb21a4fcf38602b3f43f03232ace (diff) |
Add comma, ternary, logical operators support in eval context
Diffstat (limited to 'build2/lexer.cxx')
-rw-r--r-- | build2/lexer.cxx | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/build2/lexer.cxx b/build2/lexer.cxx index 8918740..81cfea5 100644 --- a/build2/lexer.cxx +++ b/build2/lexer.cxx @@ -65,8 +65,8 @@ namespace build2 } case lexer_mode::eval: { - s1 = ":<>=! $(){}[]#\t\n"; - s2 = " == "; + s1 = ":<>=!&|?, $(){}[]#\t\n"; + s2 = " = &| "; break; } case lexer_mode::single_quoted: @@ -233,32 +233,51 @@ namespace build2 case '[': return make_token (type::lsbrace); case ']': return make_token (type::rsbrace); case '$': return make_token (type::dollar); + case '?': return make_token (type::question); + case ',': return make_token (type::comma); case '(': return make_token (type::lparen); case ')': { state_.pop (); // Expire eval mode. return make_token (type::rparen); } + // Potentially two-character tokens. + // case '=': case '!': - { - if (peek () == '=') - { - get (); - return make_token (c == '=' ? type::equal : type::not_equal); - } - break; - } case '<': case '>': + case '|': + case '&': { - bool e (peek () == '='); - if (e) - get (); + xchar p (peek ()); + + type r (type::eos); + switch (c) + { + case '|': if (p == '|') r = type::log_or; break; + case '&': if (p == '&') r = type::log_and; break; + + case '<': r = (p == '=' ? type::less_equal : type::less); break; + case '>': r = (p == '=' ? type::greater_equal : type::greater); break; + + case '=': if (p == '=') r = type::equal; break; + + case '!': r = (p == '=' ? type::not_equal : type::log_not); break; + } + + if (r == type::eos) + break; + + switch (r) + { + case type::less: + case type::greater: + case type::log_not: break; + default: get (); + } - return make_token (c == '<' - ? e ? type::less_equal : type::less - : e ? type::greater_equal : type::greater); + return make_token (r); } } |