aboutsummaryrefslogtreecommitdiff
path: root/build2/lexer.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-10-20 15:33:39 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-11-04 09:26:33 +0200
commitea9d28c0e5fe16d5a0ade210f40cb98ea191d318 (patch)
treea7a3bc27a258d476d28220bcf0e6b7932f42d622 /build2/lexer.cxx
parentcf4af1e966c5f005d5cb4b4080a9e11c106982bd (diff)
Use special mode for attribute lexing
Diffstat (limited to 'build2/lexer.cxx')
-rw-r--r--build2/lexer.cxx34
1 files changed, 25 insertions, 9 deletions
diff --git a/build2/lexer.cxx b/build2/lexer.cxx
index 8760c13..f2426e7 100644
--- a/build2/lexer.cxx
+++ b/build2/lexer.cxx
@@ -54,6 +54,13 @@ namespace build2
p = ps;
break;
}
+ case lexer_mode::attribute:
+ {
+ s1 = " $(]#\t\n";
+ s2 = " ";
+ p = ps;
+ break;
+ }
case lexer_mode::eval:
{
s1 = ":<>=! $(){}[]#\t\n";
@@ -87,11 +94,12 @@ namespace build2
switch (m)
{
case lexer_mode::normal:
- case lexer_mode::variable:
- case lexer_mode::value: break;
- case lexer_mode::eval: return next_eval ();
+ case lexer_mode::value:
+ case lexer_mode::attribute:
+ case lexer_mode::variable: break;
+ case lexer_mode::eval: return next_eval ();
case lexer_mode::double_quoted: return next_quoted ();
- default: assert (false); // Unhandled custom mode.
+ default: assert (false); // Unhandled custom mode.
}
bool sep (skip_spaces ());
@@ -109,8 +117,7 @@ namespace build2
// Handle pair separator.
//
- if ((m == lexer_mode::normal || m == lexer_mode::value) &&
- c == st.sep_pair)
+ if (c == st.sep_pair)
return make_token (type::pair_separator);
switch (c)
@@ -130,15 +137,24 @@ namespace build2
case '{': return make_token (type::lcbrace);
case '}': return make_token (type::rcbrace);
case '[': return make_token (type::lsbrace);
- case ']': return make_token (type::rsbrace);
+ case ']':
+ {
+ // Expire attribute mode after closing ']'.
+ //
+ if (m == lexer_mode::attribute)
+ state_.pop ();
+
+ return make_token (type::rsbrace);
+ }
case '$': return make_token (type::dollar);
case '(': return make_token (type::lparen);
case ')': return make_token (type::rparen);
}
- // The following characters are not treated as special in the value mode.
+ // The following characters are not treated as special in the value and
+ // attribute modes.
//
- if (m != lexer_mode::value)
+ if (m != lexer_mode::value && m != lexer_mode::attribute)
{
switch (c)
{