From 497793c854b9dfbf70c2c23813b6b7f06012bcc2 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 15 Nov 2019 15:00:25 +0200 Subject: Generalize attributes to be comma-separated with arbitrary values Before: x = [string null] After: x = [string, null] --- libbuild2/lexer.cxx | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) (limited to 'libbuild2/lexer.cxx') diff --git a/libbuild2/lexer.cxx b/libbuild2/lexer.cxx index b405929..62469ae 100644 --- a/libbuild2/lexer.cxx +++ b/libbuild2/lexer.cxx @@ -56,29 +56,32 @@ namespace build2 } case lexer_mode::values: { - // a: beginning and after `,`? s1 = " $(){},#\t\n"; s2 = " "; break; } case lexer_mode::switch_expressions: { - // a: beginning and after `,`? s1 = " $(){},:#\t\n"; s2 = " "; break; } case lexer_mode::case_patterns: { - // a: beginning and after `,` & `|`? s1 = " $(){},|:#\t\n"; s2 = " "; break; } case lexer_mode::attributes: { - s1 = " $(]#\t\n"; - s2 = " "; + s1 = " $()=,]#\t\n"; + s2 = " "; + break; + } + case lexer_mode::attribute_value: + { + s1 = " $(),]#\t\n"; + s2 = " "; break; } case lexer_mode::eval: @@ -138,6 +141,7 @@ namespace build2 case lexer_mode::switch_expressions: case lexer_mode::case_patterns: case lexer_mode::attributes: + case lexer_mode::attribute_value: case lexer_mode::variable: case lexer_mode::buildspec: break; case lexer_mode::eval: return next_eval (); @@ -214,7 +218,7 @@ namespace build2 // The following characters are special in all modes except attributes. // - if (m != lexer_mode::attributes) + if (m != lexer_mode::attributes && m != lexer_mode::attribute_value) { switch (c) { @@ -229,6 +233,14 @@ namespace build2 { switch (c) { + case '=': return make_token (type::assign); + } + } + + if (m == lexer_mode::attributes || m == lexer_mode::attribute_value) + { + switch (c) + { case ']': { state_.pop (); // Expire the attributes mode after closing `]`. @@ -289,12 +301,14 @@ namespace build2 } } - // The following characters are special in the values and buildspec mode. + // The following characters are special in the values and alike modes. // if (m == lexer_mode::buildspec || m == lexer_mode::values || m == lexer_mode::switch_expressions || - m == lexer_mode::case_patterns) + m == lexer_mode::case_patterns || + m == lexer_mode::attributes || + m == lexer_mode::attribute_value) { switch (c) { -- cgit v1.1