aboutsummaryrefslogtreecommitdiff
path: root/build2/lexer.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-11-29 15:28:47 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-11-29 15:28:47 +0200
commit4b31ef06275ad423e48a75d15fb0ee21c3127e3c (patch)
tree7cb5b1358dcb7c1650215ad319593f485d9a0caa /build2/lexer.cxx
parent97d5397a8079fc0ece521e0c36e313043bc22b12 (diff)
Fix escaping issue, propagate quoting for $ and ( tokens
Diffstat (limited to 'build2/lexer.cxx')
-rw-r--r--build2/lexer.cxx19
1 files changed, 15 insertions, 4 deletions
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<const char*> 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.