From de3de2d1a58556cff5d8549e9befe2ec3cf2d08a Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 25 May 2020 12:12:13 +0200 Subject: Add support for value subscript after expansions Value subscript is only recognized in evaluation contexts (due to ambiguity with wildcard patterns; consider: $x[123].txt) and should be unseparated from the previous token. For example: x = ($y[1]) x = (($f ? $y : $z)[1]) x = ($identity($y)[$z]) --- libbuild2/test/script/lexer.cxx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'libbuild2/test') diff --git a/libbuild2/test/script/lexer.cxx b/libbuild2/test/script/lexer.cxx index a94109b..e895d4a 100644 --- a/libbuild2/test/script/lexer.cxx +++ b/libbuild2/test/script/lexer.cxx @@ -26,8 +26,6 @@ namespace build2 void lexer:: mode (base_mode m, char ps, optional esc, uintptr_t data) { - bool a (false); // attributes - const char* s1 (nullptr); const char* s2 (nullptr); @@ -109,7 +107,8 @@ namespace build2 } assert (ps == '\0'); - state_.push (state {m, data, nullopt, a, ps, s, n, q, *esc, s1, s2}); + state_.push ( + state {m, data, nullopt, false, false, ps, s, n, q, *esc, s1, s2}); } token lexer:: @@ -153,16 +152,16 @@ namespace build2 return token (t, sep, ln, cn, token_printer); }; - // Handle attributes (do it first to make sure the flag is cleared - // regardless of what we return). + // Handle `[` (do it first to make sure the flag is cleared regardless + // of what we return). // - if (st.attributes) + if (st.lsbrace) { assert (m == lexer_mode::variable_line); - state_.top ().attributes = false; + state_.top ().lsbrace = false; // Note: st is a copy. - if (c == '[') + if (c == '[' && (!st.lsbrace_unsep || !sep)) return make_token (type::lsbrace); } -- cgit v1.1