From 4b31ef06275ad423e48a75d15fb0ee21c3127e3c Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 29 Nov 2016 15:28:47 +0200 Subject: Fix escaping issue, propagate quoting for $ and ( tokens --- build2/lexer.cxx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'build2/lexer.cxx') diff --git a/build2/lexer.cxx b/build2/lexer.cxx index 3c8eb5a..8918740 100644 --- a/build2/lexer.cxx +++ b/build2/lexer.cxx @@ -30,13 +30,19 @@ namespace build2 } void lexer:: - mode (lexer_mode m, char ps, const char* esc) + mode (lexer_mode m, char ps, optional esc) { const char* s1 (nullptr); const char* s2 (nullptr); bool s (true); bool q (true); + if (!esc) + { + assert (!state_.empty ()); + esc = state_.top ().escapes; + } + switch (m) { case lexer_mode::normal: @@ -76,7 +82,7 @@ namespace build2 default: assert (false); // Unhandled custom mode. } - state_.push (state {m, ps, s, q, esc, s1, s2}); + state_.push (state {m, ps, s, q, *esc, s1, s2}); } token lexer:: @@ -272,10 +278,15 @@ namespace build2 uint64_t ln (c.line), cn (c.column); + auto make_token = [ln, cn] (type t) + { + return token (t, false, quote_type::double_, ln, cn, token_printer); + }; + switch (c) { - case '$': return token (type::dollar, false, ln, cn, token_printer); - case '(': return token (type::lparen, false, ln, cn, token_printer); + case '$': return make_token (type::dollar); + case '(': return make_token (type::lparen); } // Otherwise it is a word. -- cgit v1.1