From 79a83d6dd0f312a5e390f5627f68cc96c4427d33 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 24 Oct 2016 18:00:05 +0200 Subject: Add support for setup/teardown commands --- build2/test/script/lexer.cxx | 57 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 12 deletions(-) (limited to 'build2/test/script/lexer.cxx') diff --git a/build2/test/script/lexer.cxx b/build2/test/script/lexer.cxx index ea906a1..7ced2b9 100644 --- a/build2/test/script/lexer.cxx +++ b/build2/test/script/lexer.cxx @@ -30,14 +30,31 @@ namespace build2 s2 = " == "; break; } - case lexer_mode::assign_line: + case lexer_mode::first_token: { - // As script_line but with variable assignments. + // First token on the script line. Like script_line but recognizes + // leading plus/minus and variable assignments as separators. + // + // Note that to recognize only leading plus/minus we shouldn't add + // them to the separator strings. // s1 = ";=+!|&<> $(#\t\n"; s2 = " == "; break; } + case lexer_mode::second_token: + { + // Second token on the script line. Like script_line but + // recognizes leading variable assignments. + // + // Note that to recognize only leading assignments we shouldn't + // add them to the separator strings (so this is identical to + // script_line). + // + s1 = ";=!|&<> $(#\t\n"; + s2 = " == "; + break; + } case lexer_mode::variable_line: { // Like value except we recognize ';' and don't recognize '{'. @@ -87,7 +104,8 @@ namespace build2 switch (state_.top ().mode) { case lexer_mode::script_line: - case lexer_mode::assign_line: + case lexer_mode::first_token: + case lexer_mode::second_token: case lexer_mode::variable_line: case lexer_mode::command_line: case lexer_mode::here_line: r = next_line (); break; @@ -116,13 +134,13 @@ namespace build2 if (eos (c)) return make_token (type::eos); - state st (state_.top ()); // Make copy (see assign_line). + state st (state_.top ()); // Make copy (see first/second_token). lexer_mode m (st.mode); - // Expire the assign mode at the end of the token. Do it early in case + // Expire certain modes at the end of the token. Do it early in case // we push any new mode (e.g., double quote). // - if (m == lexer_mode::assign_line) + if (m == lexer_mode::first_token || m == lexer_mode::second_token) state_.pop (); // NOTE: remember to update mode() if adding new special characters. @@ -161,8 +179,9 @@ namespace build2 // Line separators. // - if (m == lexer_mode::script_line || - m == lexer_mode::assign_line || + if (m == lexer_mode::script_line || + m == lexer_mode::first_token || + m == lexer_mode::second_token || m == lexer_mode::variable_line) { switch (c) @@ -173,7 +192,9 @@ namespace build2 // Command line operator/separators. // - if (m == lexer_mode::script_line || m == lexer_mode::assign_line) + if (m == lexer_mode::script_line || + m == lexer_mode::first_token || + m == lexer_mode::second_token) { switch (c) { @@ -193,8 +214,9 @@ namespace build2 // Command operators/separators. // - if (m == lexer_mode::script_line || - m == lexer_mode::assign_line || + if (m == lexer_mode::script_line || + m == lexer_mode::first_token || + m == lexer_mode::second_token || m == lexer_mode::command_line) { switch (c) @@ -291,9 +313,20 @@ namespace build2 } } + // Plus/minus. + // + if (m == lexer_mode::first_token) + { + switch (c) + { + case '+': return make_token (type::plus); + case '-': return make_token (type::minus); + } + } + // Variable assignment (=, +=, =+). // - if (m == lexer_mode::assign_line) + if (m == lexer_mode::second_token) { switch (c) { -- cgit v1.1