From b408d19f614b47670cd0a0def501266f0d7689b5 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Tue, 18 Oct 2022 15:13:29 +0300 Subject: Fix unexpected 'unterminated double-quoted sequence' script error --- libbuild2/build/script/lexer.cxx | 17 +++++++---------- libbuild2/build/script/lexer.hxx | 2 ++ libbuild2/build/script/parser+diag.test.testscript | 13 ++++++++----- libbuild2/build/script/parser+for.test.testscript | 12 ++++++------ 4 files changed, 23 insertions(+), 21 deletions(-) (limited to 'libbuild2/build') diff --git a/libbuild2/build/script/lexer.cxx b/libbuild2/build/script/lexer.cxx index 5c13239..e0d87fe 100644 --- a/libbuild2/build/script/lexer.cxx +++ b/libbuild2/build/script/lexer.cxx @@ -35,10 +35,7 @@ namespace build2 bool q (true); // quotes if (!esc) - { - assert (!state_.empty ()); - esc = state_.top ().escapes; - } + esc = current_state ().escapes; switch (m) { @@ -107,7 +104,7 @@ namespace build2 } assert (ps == '\0'); - state_.push ( + mode_impl ( state {m, data, nullopt, false, false, ps, s, n, q, *esc, s1, s2}); } @@ -116,7 +113,7 @@ namespace build2 { token r; - switch (state_.top ().mode) + switch (mode ()) { case lexer_mode::command_line: case lexer_mode::first_token: @@ -142,7 +139,7 @@ namespace build2 xchar c (get ()); uint64_t ln (c.line), cn (c.column); - state st (state_.top ()); // Make copy (see first/second_token). + state st (current_state ()); // Make copy (see first/second_token). lexer_mode m (st.mode); auto make_token = [&sep, ln, cn] (type t) @@ -158,7 +155,7 @@ namespace build2 assert (m == lexer_mode::variable_line || m == lexer_mode::for_loop); - state_.top ().lsbrace = false; // Note: st is a copy. + current_state ().lsbrace = false; // Note: st is a copy. if (c == '[' && (!st.lsbrace_unsep || !sep)) return make_token (type::lsbrace); @@ -171,7 +168,7 @@ namespace build2 // we push any new mode (e.g., double quote). // if (m == lexer_mode::first_token || m == lexer_mode::second_token) - state_.pop (); + expire_mode (); // NOTE: remember to update mode() if adding new special characters. @@ -182,7 +179,7 @@ namespace build2 // Expire variable value mode at the end of the line. // if (m == lexer_mode::variable_line) - state_.pop (); + expire_mode (); sep = true; // Treat newline as always separated. return make_token (type::newline); diff --git a/libbuild2/build/script/lexer.hxx b/libbuild2/build/script/lexer.hxx index 313d80a..3f51493 100644 --- a/libbuild2/build/script/lexer.hxx +++ b/libbuild2/build/script/lexer.hxx @@ -68,6 +68,8 @@ namespace build2 static redirect_aliases_type redirect_aliases; private: + using build2::script::lexer::mode; // Getter. + token next_line (); }; diff --git a/libbuild2/build/script/parser+diag.test.testscript b/libbuild2/build/script/parser+diag.test.testscript index 272d10c..a720fe2 100644 --- a/libbuild2/build/script/parser+diag.test.testscript +++ b/libbuild2/build/script/parser+diag.test.testscript @@ -45,16 +45,19 @@ $* <>EOO diag: copy foo EOO - # @@ TMP Enable when the unexpected 'unterminated double-quoted sequence' - # error is fixed. - #\ : quoted : - $* <false + $* <'diag: foo' f = foo diag "$f" EOI - #\ + + : quoted-eval + : + $* <'diag: foo' + f = foo + diag "($f)" + EOI : temp_dir : diff --git a/libbuild2/build/script/parser+for.test.testscript b/libbuild2/build/script/parser+for.test.testscript index 880b03c..2a9f169 100644 --- a/libbuild2/build/script/parser+for.test.testscript +++ b/libbuild2/build/script/parser+for.test.testscript @@ -543,20 +543,20 @@ buildfile:11:1: error: for: missing variable name EOE - # @@ TMP Enable when the unexpected 'unterminated double-quoted sequence' - # error is fixed. - #\ - : quoted-ops + : quoted-opt : $* <>EOO - o=-w + o = -w for "$o" x <'a b' cmd $x end + for "($o)" x <'a b' + cmd $x + end EOI for -w x <'a b' + for -w x <'a b' EOO - #\ : untyped : -- cgit v1.1